framework
framework/fastapi/router/zero-logic-principle.md
medium
fastapi-router-zero-logic
Router 零逻辑 — 只做接收/注入/调用/返回,3 行内。Use when 写 Python 后端代码 / 评审涉及 `zero-logic-principle` 的 PR。
@routerapirouterfastapi零逻辑只做接收注入
paths
backend/routers/**/*.pypy/routers/**/*.py
FastAPI Router · 零逻辑
规则
Router 只做 4 件事:接收 → 注入 → 调用 → 返回。三行以内。
标准模板
# backend/routers/textbooks.py
from fastapi import APIRouter, Depends
from schemas.textbook import TextbookListReq, TextbookListResp
from services.textbook import service_list_textbooks
from core.response import JsonData
from core.deps import get_current_user, get_redis_pool
router = APIRouter(prefix="/api/textbooks", tags=["Textbook"])
@router.post("/list", response_model=JsonData[TextbookListResp])
async def list_textbooks(
req: TextbookListReq,
current_user=Depends(get_current_user),
redis_pool=Depends(get_redis_pool),
):
result = await service_list_textbooks(
req=req,
user_id=current_user["account_id"],
redis_pool=redis_pool,
)
return JsonData.success(result)
反例
# ❌ Router 写业务逻辑
@router.post("/list")
async def list_textbooks(req: TextbookListReq):
if req.subject == "math":
items = await Textbook.filter(subject="math").all() # 直接查 DB
else:
items = await Textbook.all()
for item in items: # 业务规则
if item.is_premium and not current_user.is_paid:
item.locked = True
return [t.dict() for t in items] # 手工序列化
正确分工
| 层 | 职责 |
|---|---|
| Router | 接收 / 注入 / 调用 / 返回 |
| Service | 业务编排(校验、查询、Agent 调用、组装) |
| Adapter | ORM → Pydantic 规整 |
| Model | Tortoise ORM 表定义 |
response_model 必填
# ✅
@router.post("/create", response_model=JsonData[PresentationResp])
async def create(...): ...
# ❌ 不写 response_model 等于失去类型检查
@router.post("/create")
async def create(...) -> Any: ...
SSE 流式响应
详见 sse-streaming.md。
自检
- [ ] Router 函数体 ≤ 5 行?
- [ ] 不直接查 DB(不 import Tortoise Model)?
- [ ] 不写 if/for 业务判断?
- [ ] response_model 必填?
- [ ] 用
Depends注入依赖?