《写给前端的python应用指南》系列:
- (一)快速构建 Web 服务器 - Flask vs Node.js 对比
- (二)深入Flask:理解Flask的应用结构与模块化设计
- (三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
- (四)Django实战:创建一个简单的博客系统
在前几篇博文中,我们分别介绍了Flask和Django,讲解了它们在构建Web应用方面的优势和应用场景。今天,我们将探讨另一个Python Web框架------FastAPI,它以其高性能、易用性和现代化的特性迅速成为构建API的热门选择。本文将引导你使用FastAPI快速构建一个高性能的API,帮助你更好地理解FastAPI的核心特性及其优势。
一、FastAPI简介
FastAPI是一个现代的、快速(高性能)的Web框架,用于构建API。它基于Python 3.6+的类型提示,具有自动生成API文档的功能,同时还具有非常出色的性能,接近于Go和Node.js等编程语言的表现。FastAPI的设计灵感来自于Flask和Pydantic,并利用了Python的类型提示和异步编程模型,使得开发者可以用更少的代码实现更高效、更安全、更易于维护的API。
1.1 FastAPI的核心特点
- 高性能:FastAPI基于Starlette和Uvicorn构建,充分利用了异步编程模型,因此在处理高并发请求时具有非常优秀的性能。
- 自动化文档生成:FastAPI内置了对OpenAPI和JSON Schema的支持,自动生成交互式的API文档,可以通过Swagger UI或者ReDoc来查看。
- 类型提示和验证:FastAPI利用Python类型提示自动生成请求和响应的验证和文档,从而减少了手动验证的工作量。
- 异步支持:FastAPI原生支持异步API处理,能够在IO密集型任务中显著提高性能。
- 简单易用:通过类型注解和现代化的语法,使得FastAPI的学习曲线较低,开发者可以快速上手。
二、FastAPI与Flask、Django对比
-
与Flask对比:Flask是一个轻量级的Web框架,专注于灵活性和扩展性,而FastAPI在灵活性的基础上,提供了更强的性能、类型安全和自动化文档生成。Flask适合中小型项目,FastAPI则适用于对性能要求较高的API服务。
-
与Django对比:Django是一个全栈框架,通常用于构建复杂的Web应用,而FastAPI更专注于API构建,特别是在性能和开发效率上具有优势。Django适用于大型Web应用,FastAPI适用于构建高效、可扩展的API服务。
三、快速上手FastAPI
3.1 安装FastAPI和Uvicorn
首先,确保你已安装了Python 3.6或更高版本。接着,你可以通过以下命令安装FastAPI和Uvicorn。
bash
pip install fastapi uvicorn
- FastAPI:Web框架本身。
- Uvicorn:ASGI服务器,用于运行FastAPI应用。
3.2 创建一个简单的API
让我们创建一个简单的FastAPI应用,包含一个基本的GET请求和POST请求。
- 创建一个名为
main.py
的文件,并添加以下代码:
python
from fastapi import FastAPI
from pydantic import BaseModel
# 创建FastAPI实例
app = FastAPI()
# 定义一个请求体模型
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
# 定义一个GET请求
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
# 定义一个POST请求
@app.post("/items/")
def create_item(item: Item):
return {"name": item.name, "price": item.price, "tax": item.tax}
3.3 解释代码
- FastAPI实例 :
app = FastAPI()
创建了一个FastAPI应用实例。 - 请求体模型 :
Item
类使用Pydantic
库来定义API请求体的模型。Pydantic支持数据验证和自动生成OpenAPI文档。name
、description
、price
和tax
分别表示商品的名称、描述、价格和税费。
- 路由处理函数 :
read_root
:该函数响应GET请求,并返回一条简单的JSON消息。create_item
:该函数响应POST请求,接收一个Item
对象作为请求体,并返回商品的名称和价格。
3.4 运行应用
运行FastAPI应用非常简单,只需在终端中执行以下命令:
bash
uvicorn main:app --reload
main
: 指的是文件名(不需要加.py
后缀)。app
: 指的是FastAPI实例。--reload
: 启用自动重载功能,适合开发时使用。
访问 http://127.0.0.1:8000,你将看到FastAPI自动生成的文档界面,支持Swagger UI和ReDoc。
3.5 交互式文档
FastAPI自动生成的API文档非常直观,访问 http://127.0.0.1:8000/docs 你将看到Swagger UI界面,它展示了所有可用的API端点、请求方式、请求参数以及响应结构。
如果你更喜欢ReDoc风格的文档,可以访问 http://127.0.0.1:8000/redoc。
四、更多功能
FastAPI不仅仅是构建简单API那么简单,它提供了很多强大的功能,帮助开发者在构建生产级别API时提高效率和可靠性。
4.1 请求参数验证
FastAPI支持从查询参数、路径参数和请求体中自动提取数据,并进行类型验证。
例如,以下是通过查询参数传递数据:
python
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
访问路径 /items/?skip=5&limit=20
时,FastAPI会自动验证并解析查询参数。
4.2 依赖注入
FastAPI的依赖注入系统使得你可以轻松地复用代码,处理认证、数据库连接、配置等功能。通过Depends
,你可以将某些逻辑抽象为可重用的组件。
python
from fastapi import Depends
def common_parameters(q: str = None, skip: int = 0, limit: int = 10):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
return commons
4.3 异步支持
FastAPI原生支持异步编程,能够显著提高IO密集型任务(如数据库查询、外部API请求等)的性能。
python
import asyncio
@app.get("/items/")
async def read_items():
await asyncio.sleep(1)
return {"message": "This was a slow response"}
4.4 安全和认证
FastAPI内置了对OAuth2、JWT、API密钥等认证方式的支持,确保你的API具备高安全性。
例如,使用OAuth2
认证:
python
from fastapi import Security
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.get("/items/")
def read_items(token: str = Depends(oauth2_scheme)):
return {"token": token}
五、性能优势
FastAPI的一个显著特点是其卓越的性能,接近Go和Node.js的速度。FastAPI利用异步编程、Pydantic验证和Starlette的高效路由等特性,在处理大量并发请求时具有显著的优势。根据官方基准测试,FastAPI的性能在所有Python Web框架中位居前列。
5.1 性能测试
你可以通过uvicorn
和gunicorn
组合来运行FastAPI应用,进一步提高并发性能。以下是一个使用gunicorn
来部署FastAPI应用的命令:
bash
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
-w 4
:表示启动4个工作进程。-k uvicorn.workers.UvicornWorker
:指定使用Uvicorn的工作进程来运行FastAPI应用。
六、总结
通过本篇博文,我们快速入门了FastAPI,并使用它构建了一个简单的API。FastAPI不仅高效、易用,而且能够自动生成API文档,简化了开发过程中的许多繁琐任务。它的异步支持和类型验证功能使得它非常适合构建高性能、可维护的API服务。
FastAPI的优势在于其高性能和开发效率,非常适合处理高并发、高请求量的应用场景。如果你正在寻找一个现代、快速且功能强大的Python API框架,FastAPI无疑是一个非常不错的选择。
希望通过本篇教程,你能够了解FastAPI的基本功能,并在你的项目中实现更高效、更稳定的API构建。