python-fastapi-patterns
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseFastAPI Patterns
FastAPI 设计模式
Modern async API development with FastAPI.
基于FastAPI的现代异步API开发。
Basic Application
基础应用
python
from fastapi import FastAPI
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan - startup and shutdown."""
# Startup
app.state.db = await create_db_pool()
yield
# Shutdown
await app.state.db.close()
app = FastAPI(
title="My API",
version="1.0.0",
lifespan=lifespan,
)
@app.get("/")
async def root():
return {"message": "Hello World"}python
from fastapi import FastAPI
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan - startup and shutdown."""
# Startup
app.state.db = await create_db_pool()
yield
# Shutdown
await app.state.db.close()
app = FastAPI(
title="My API",
version="1.0.0",
lifespan=lifespan,
)
@app.get("/")
async def root():
return {"message": "Hello World"}Request/Response Models
请求/响应模型
python
from pydantic import BaseModel, Field, EmailStr
from datetime import datetime
class UserCreate(BaseModel):
"""Request model with validation."""
name: str = Field(..., min_length=1, max_length=100)
email: EmailStr
age: int = Field(..., ge=0, le=150)
class UserResponse(BaseModel):
"""Response model."""
id: int
name: str
email: EmailStr
created_at: datetime
model_config = {"from_attributes": True} # Enable ORM mode
@app.post("/users", response_model=UserResponse, status_code=201)
async def create_user(user: UserCreate):
db_user = await create_user_in_db(user)
return db_userpython
from pydantic import BaseModel, Field, EmailStr
from datetime import datetime
class UserCreate(BaseModel):
"""Request model with validation."""
name: str = Field(..., min_length=1, max_length=100)
email: EmailStr
age: int = Field(..., ge=0, le=150)
class UserResponse(BaseModel):
"""Response model."""
id: int
name: str
email: EmailStr
created_at: datetime
model_config = {"from_attributes": True} # Enable ORM mode
@app.post("/users", response_model=UserResponse, status_code=201)
async def create_user(user: UserCreate):
db_user = await create_user_in_db(user)
return db_userPath and Query Parameters
路径与查询参数
python
from fastapi import Query, Path
from typing import Annotated
@app.get("/users/{user_id}")
async def get_user(
user_id: Annotated[int, Path(..., ge=1, description="User ID")],
):
return await fetch_user(user_id)
@app.get("/users")
async def list_users(
skip: Annotated[int, Query(ge=0)] = 0,
limit: Annotated[int, Query(ge=1, le=100)] = 10,
search: str | None = None,
):
return await fetch_users(skip=skip, limit=limit, search=search)python
from fastapi import Query, Path
from typing import Annotated
@app.get("/users/{user_id}")
async def get_user(
user_id: Annotated[int, Path(..., ge=1, description="User ID")],
):
return await fetch_user(user_id)
@app.get("/users")
async def list_users(
skip: Annotated[int, Query(ge=0)] = 0,
limit: Annotated[int, Query(ge=1, le=100)] = 10,
search: str | None = None,
):
return await fetch_users(skip=skip, limit=limit, search=search)Dependency Injection
依赖注入
python
from fastapi import Depends
from typing import Annotated
async def get_db():
"""Database session dependency."""
async with async_session() as session:
yield session
async def get_current_user(
token: Annotated[str, Depends(oauth2_scheme)],
db: Annotated[AsyncSession, Depends(get_db)],
) -> User:
"""Authenticate and return current user."""
user = await authenticate_token(db, token)
if not user:
raise HTTPException(status_code=401, detail="Invalid token")
return userpython
from fastapi import Depends
from typing import Annotated
async def get_db():
"""Database session dependency."""
async with async_session() as session:
yield session
async def get_current_user(
token: Annotated[str, Depends(oauth2_scheme)],
db: Annotated[AsyncSession, Depends(get_db)],
) -> User:
"""Authenticate and return current user."""
user = await authenticate_token(db, token)
if not user:
raise HTTPException(status_code=401, detail="Invalid token")
return userAnnotated types for reuse
Annotated types for reuse
DB = Annotated[AsyncSession, Depends(get_db)]
CurrentUser = Annotated[User, Depends(get_current_user)]
@app.get("/me")
async def get_me(user: CurrentUser):
return user
undefinedDB = Annotated[AsyncSession, Depends(get_db)]
CurrentUser = Annotated[User, Depends(get_current_user)]
@app.get("/me")
async def get_me(user: CurrentUser):
return user
undefinedException Handling
异常处理
python
from fastapi import HTTPException
from fastapi.responses import JSONResponsepython
from fastapi import HTTPException
from fastapi.responses import JSONResponseBuilt-in HTTP exceptions
Built-in HTTP exceptions
@app.get("/items/{item_id}")
async def get_item(item_id: int):
item = await fetch_item(item_id)
if not item:
raise HTTPException(status_code=404, detail="Item not found")
return item
@app.get("/items/{item_id}")
async def get_item(item_id: int):
item = await fetch_item(item_id)
if not item:
raise HTTPException(status_code=404, detail="Item not found")
return item
Custom exception handler
Custom exception handler
class ItemNotFoundError(Exception):
def init(self, item_id: int):
self.item_id = item_id
@app.exception_handler(ItemNotFoundError)
async def item_not_found_handler(request, exc: ItemNotFoundError):
return JSONResponse(
status_code=404,
content={"detail": f"Item {exc.item_id} not found"},
)
undefinedclass ItemNotFoundError(Exception):
def init(self, item_id: int):
self.item_id = item_id
@app.exception_handler(ItemNotFoundError)
async def item_not_found_handler(request, exc: ItemNotFoundError):
return JSONResponse(
status_code=404,
content={"detail": f"Item {exc.item_id} not found"},
)
undefinedRouter Organization
路由组织
python
from fastapi import APIRouterpython
from fastapi import APIRouterusers.py
users.py
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/")
async def list_users():
return []
@router.get("/{user_id}")
async def get_user(user_id: int):
return {"id": user_id}
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/")
async def list_users():
return []
@router.get("/{user_id}")
async def get_user(user_id: int):
return {"id": user_id}
main.py
main.py
from app.routers import users, items
app.include_router(users.router)
app.include_router(items.router, prefix="/api/v1")
undefinedfrom app.routers import users, items
app.include_router(users.router)
app.include_router(items.router, prefix="/api/v1")
undefinedQuick Reference
快速参考
| Feature | Usage |
|---|---|
| Path param | |
| Query param | |
| Body | |
| Dependency | |
| Auth | |
| Response model | |
| Status code | |
| 特性 | 用法 |
|---|---|
| 路径参数 | |
| 查询参数 | |
| 请求体 | |
| 依赖项 | |
| 身份验证 | |
| 响应模型 | |
| 状态码 | |
Additional Resources
额外资源
- - Advanced DI patterns, scopes, caching
./references/dependency-injection.md - - Middleware chains, CORS, error handling
./references/middleware-patterns.md - - Pydantic v2 patterns, custom validators
./references/validation-serialization.md - - Background tasks, async workers, scheduling
./references/background-tasks.md
- - 高级依赖注入模式、作用域、缓存
./references/dependency-injection.md - - 中间件链、CORS、异常处理
./references/middleware-patterns.md - - Pydantic v2模式、自定义验证器
./references/validation-serialization.md - - 后台任务、异步工作器、调度
./references/background-tasks.md
Scripts
脚本
- - Generate API endpoint boilerplate
./scripts/scaffold-api.sh
- - 生成API端点模板代码
./scripts/scaffold-api.sh
Assets
资源文件
- - Production-ready FastAPI app skeleton
./assets/fastapi-template.py
- - 生产就绪的FastAPI应用骨架
./assets/fastapi-template.py
See Also
另请参阅
Prerequisites:
- - Pydantic models and type hints
python-typing-patterns - - Async endpoint patterns
python-async-patterns
Related Skills:
- - SQLAlchemy integration
python-database-patterns - - Logging, metrics, tracing middleware
python-observability-patterns - - API testing with TestClient
python-pytest-patterns
前置要求:
- - Pydantic模型与类型提示
python-typing-patterns - - 异步端点模式
python-async-patterns
相关技能:
- - SQLAlchemy集成
python-database-patterns - - 日志、指标、追踪中间件
python-observability-patterns - - 使用TestClient进行API测试
python-pytest-patterns