FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,与 Python 3.6+ 类型提示一起使用。它基于 Starlette 和 Pydantic,旨在快速开发高效且易于维护的 API。以下是掌握 FastAPI 从入门到高效开发的全景指南。
第一章:FastAPI 简介
1.1 FastAPI 的起源
FastAPI 由 Python 核心开发者之一、Starlette 的创造者 Sebastián Ramírez 开发。它旨在解决传统 Web 框架中常见的问题,如速度、性能、易于使用和维护。
1.2 FastAPI 的特点
- 快速开发:通过自动生成代码,简化开发过程。
- 高性能:使用 Starlette 和 Uvicorn,提供高性能的 API。
- 类型安全:利用 Python 类型提示进行数据验证。
- 可扩展性:易于扩展和定制。
- 易于测试:支持自动测试。
第二章:FastAPI 入门
2.1 快速安装
首先,你需要安装 Python 3.6 或更高版本。然后,使用 pip 安装 FastAPI:
pip install fastapi uvicorn
2.2 创建第一个 FastAPI 应用
创建一个名为 main.py 的文件,并添加以下代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
使用 Uvicorn 运行应用:
uvicorn main:app --reload
访问 http://127.0.0.1:8000/,你应该会看到如下响应:
{
"Hello": "World"
}
2.3 使用 Pydantic
FastAPI 使用 Pydantic 进行数据验证。以下是一个使用 Pydantic 模型的示例:
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
在 FastAPI 路由中,你可以这样使用它:
@app.post("/items/")
async def create_item(item: Item):
return item
现在,当你发送一个包含 name 和 price 的 POST 请求到 /items/ 时,FastAPI 会自动验证这些数据。
第三章:FastAPI 进阶
3.1 路由参数
在 FastAPI 中,你可以使用路径参数来获取 URL 中的数据。以下是一个示例:
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
3.2 嵌套路由
FastAPI 支持嵌套路由,这使得你的 API 结构更加清晰。以下是一个示例:
@app.route("/items/")
class Item:
@app.get("/")
async def read_items():
return [{"item_id": 1, "name": "Item1"}]
@app.get("/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id, "name": "Item1"}
3.3 依赖注入
FastAPI 支持依赖注入,这意味着你可以将服务或对象注入到路由中。以下是一个示例:
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status_code.UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token(data={"sub": user.username})
return {"access_token": access_token, "token_type": "bearer"}
3.4 部署 FastAPI
将 FastAPI 应用部署到生产环境之前,你需要确保:
- 使用 HTTPS。
- 优化性能。
- 使用日志记录。
常用的部署工具包括 Heroku、Gunicorn 和 uWSGI。
第四章:FastAPI 高效开发技巧
4.1 代码复用
FastAPI 支持代码复用,这意味着你可以创建通用的函数和类,然后在多个路由中使用它们。
4.2 使用中间件
中间件可以修改请求和响应。以下是一个示例:
from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
print(f"Request: {request.method} {request.url}")
response = await call_next(request)
print(f"Response: {response.status_code}")
return response
app.add_middleware(LoggingMiddleware)
4.3 测试 FastAPI
FastAPI 支持自动测试。以下是一个测试示例:
from fastapi.testclient import TestClient
client = TestClient(app)
def test_read_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"Hello": "World"}
第五章:总结
FastAPI 是一个功能强大的 Web 框架,可以帮助你快速开发高性能的 API。通过掌握 FastAPI,你可以构建出易于维护和扩展的应用。希望这篇指南能帮助你从入门到高效开发 FastAPI。祝你学习愉快!
