目录
引言
FastAPI 是一款现代化的 Python 后端框架,专注于提供高性能、快速开发的能力。由于其基于标准的 Python 类型提示和异步编程的支持,它在保持代码清晰可读的同时,能够实现出色的性能。FastAPI 是基于 Starlette 框架构建的,Starlette 是一个轻量级、高性能的异步框架,这也为 FastAPI 提供了强大的基础。
特性
1. 异步支持
FastAPI 是一个异步框架,利用 Python 的 async 和 await 关键字,允许并发处理多个请求,提高应用程序的性能。异步编程使得可以高效地处理 I/O 密集型任务,如数据库查询、网络请求等,从而更好地应对高并发的场景。
2. 类型提示
FastAPI 利用 Python 3.7+ 中引入的类型提示功能,使得代码更加规范、可读,并且通过类型检查工具如 Mypy 可以进行静态类型检查,提高代码质量。类型提示不仅仅用于函数参数和返回值,还能够用于请求和响应体,从而提供更好的文档生成和代码智能感知。
3. 自动生成文档
一个强大的特性是 FastAPI 可以自动生成交互式 API 文档。使用 Swagger UI 和 ReDoc,你可以直接在浏览器中查看并测试 API,而无需手动编写文档。这大大简化了文档的维护工作,保持文档与代码的同步。
4. 数据验证与序列化
FastAPI 提供了强大的请求数据验证和响应数据序列化功能。通过类型提示,FastAPI 可以自动生成请求验证逻辑,确保传入的数据符合预期的格式。同时,FastAPI 也支持 Pydantic 模型,可以自动进行请求和响应体的序列化和反序列化,使得数据的处理更为方便。
5. 依赖注入系统
FastAPI 的依赖注入系统使得处理请求的逻辑更加模块化和可维护。通过声明依赖,可以将逻辑分解成小的、可测试的组件,提高代码的可读性和可维护性。
6. 安全性
FastAPI 内置了许多安全功能,包括对跨站点请求伪造(CSRF)的防护、对敏感信息的验证、密码哈希等。此外,通过 OAuth2 和 JWT(JSON Web Tokens)的支持,可以轻松实现用户身份验证和授权。
7. WebSocket 支持
除了处理 HTTP 请求外,FastAPI 还支持 WebSocket,使得构建实时应用程序变得更加容易。WebSocket 是一种双向通信协议,适用于需要实时更新的应用,如即时聊天、实时数据推送等。
快速上手
1. 安装 FastAPI
使用 pip 安装 FastAPI:
pip install fastapi
2. 编写第一个 FastAPI 应用
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, query_param: str = None):
return {"item_id": item_id, "query_param": query_param}
3. 运行应用
保存上述代码到 main.py
文件,然后运行以下命令:
uvicorn main:app --reload
详细解析
1. 异步支持
FastAPI 的异步支持基于 Python 的 asyncio
模块,可以通过 async def
定义异步函数,使用 await
关键字等待异步操作完成。这使得处理 I/O 密集型任务变得更加高效,例如数据库查询、网络请求等。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
@app.get("/async_endpoint")
async def async_endpoint():
result = await some_async_function()
return {"result": result}
2. 类型提示
FastAPI 利用类型提示提供了强大的自动文档生成和请求数据验证。通过类型提示,可以清晰地定义函数的输入和输出。
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, query_param: str = None):
return {"item_id": item_id, "query_param": query_param}
在上述例子中,item_id
是一个整数,query_param
是一个可选的字符串。FastAPI 将根据这些信息自动生成文档,并在请求时验证传入的参数类型。
3. 自动生成文档
FastAPI 自动生成的文档使用 Swagger UI 和 ReDoc,通过访问 /docs
或 /redoc
可以在浏览器中查看并测试 API。
Swagger UI 提供了一个交互式的 API 浏览界面,方便用户测试每个端点的功能。ReDoc 则提供了一个简洁、响应式的文档界面,适合移动设备和桌面浏览。
4. 数据验证与序列化
通过类型提示,FastAPI 自动生成了请求数据验证的逻辑,确保传入的数据符合预期的格式。同时,FastAPI 支持使用 Pydantic 模型进行更复杂的验证和序列化。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
async def create_item(item: Item):
return item
在上述例子中,Item
是一个 Pydantic 模型,它定义了一个名为 item
的请求体,包含了 name
、description
、price
和 tax
等字段。FastAPI 将自动验证请求数据,并确保它符合 Item
模型的定义。
5. 依赖注入系统
FastAPI 的依赖注入系统使得处理请求的逻辑更加模块化和可维护。通过声明依赖,可以将逻辑分解成小的、可测试的组件。
from fastapi import FastAPI, Depends
app = FastAPI()
async def get_query_param(query_param: str = None):
return query_param
@app.get("/items/")
async def read_item(query_param: str = Depends(get_query_param)):
return {"query_param": query_param}
在上述例子中,get_query_param
是一个依赖函数,通过声明 Depends
将其注入到 read_item
函数中。这使得逻辑更加清晰,同时依赖可以被单独测试。
6. 安全性
FastAPI 内置了许多安全功能,例如对跨站点请求伪造(CSRF)的防护、对敏感信息的验证、密码哈希等。通过 OAuth2 和 JWT 的支持,可以轻松实现用户身份验证和授权。
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
# 在这里执行验证 token 的逻辑,例如解析 JWT
# 如果验证失败,抛出 credentials_exception 异常
# 如果验证成功,返回用户信息
return token
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}
在上述例子中,get_current_user
函数通过 Depends
被注入到 read_users_me
函数中,实现了对用户身份的验证。如果验证失败,将抛出 HTTPException
异常,返回 401 未授权状态码。
7. WebSocket 支持
FastAPI 不仅支持处理 HTTP 请求,还提供了对 WebSocket 的原生支持。通过 WebSocket
类和 websocket_route
装饰器,可以轻松构建支持实时双向通信的应用。
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket_route("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Message text was: {data}")
在上述例子中,websocket_endpoint
函数处理 WebSocket 连接,并在接收到消息时回传相同的消息。这使得构建实时聊天、实时数据推送等应用变得更加容易。
总结
FastAPI 是一个功能强大、易于使用的现代化 Python 后端框架,它通过异步支持、类型提示、自动生成文档等特性,使得开发高性能、可维护的 Web 应用变得更加简单。无论是构建 RESTful API 还是实现实时应用程序,FastAPI 都提供了丰富的功能和灵活的工具,成为 Python 后端开发的首选框架之一。通过学习和深入了解 FastAPI,你可以更加高效地构建出安全、可靠、高性能的 Web 应用。