使用类型提示、验证和异步支持,快速构建生产级 Python API。
FastAPI 模式是一项面向实际任务的技能,主要用于Async Traps. 混合同步数据库驱动程序( psycopg2, PyMySQL) 在 Async 端点屏蔽事件循环 – 使用 async 驱动程序( asyncpg, aiomysql) 或在 run in execut 中运行同步代码。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
run_in_executor 运行同步代码time.sleep() 会导致整个事件循环阻塞 —— 应改用 await asyncio.sleep()ProcessPoolExecutor 或后台工作进程items: list = [])会成为跨请求共享的可变状态 —— 应使用 Field(default_factory=list)Optional[str] 并不会使字段在请求中变为可选 —— 需显式指定 = None,或使用 Field(default=None)model_validate() 替代已弃用的 parse_obj(),使用 model_dump() 替代已弃用的 .dict()Annotated[str, Field(min_length=1)] 定义可复用的校验类型,避免重复声明约束条件lru_cache 缓存,或将其缓存在 app.state 中作为单例Depends() 若不传入参数,则自动复用类型提示作为依赖项 —— 写法简洁但可能令读者困惑yield 依赖 —— yield 后的代码无论端点是否抛出异常均会执行@app.on_event("startup") 已被弃用 —— 应改用 lifespan 异步上下文管理器app.state,而非使用全局变量from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app):
app.state.db = await create_pool()
yield
await app.state.db.close()
app = FastAPI(lifespan=lifespan)
dict,而非直接返回 Pydantic 模型 —— FastAPI 自动处理序列化,且性能更优status_code=201 —— 默认的 200 状态码语义上不准确Response 并指定 media_type="text/plain" —— 否则直接返回字符串仍会被 JSON 编码response_model_exclude_unset=True 可从响应中排除值为 None 的字段 —— 输出更清晰简洁raise HTTPException(status_code=404) 抛出错误 —— 不应返回 Response 对象,否则将绕过中间件@app.exception_handler(CustomError) 注册自定义异常处理器 —— 但注意其无法捕获 HTTPExceptiondetail= 参数提供面向用户的提示信息,并单独记录原始错误日志 —— 切勿向客户端泄露堆栈跟踪BackgroundTasks 在响应发送后执行,但仍处于同一进程内 —— 不适用于长时间运行的任务OAuth2PasswordBearer 仅用于 OpenAPI 文档生成 —— 它本身不校验令牌,实际校验逻辑需在依赖项中实现Depends(get_current_user) 应应用于路径操作(path operation),而非路由器(router)—— 路由器级依赖会影响所有子路径(包括健康检查接口)TestClient 即使对异步端点也以同步方式运行 —— 如需真正异步测试,应使用 httpx.AsyncClient 配合 ASGITransportapp.dependency_overrides[get_db] = mock_db 覆盖依赖项 —— 比 monkeypatch 更清晰可靠TestClient 必须配合上下文管理器使用(即 with TestClient(app) as client:),否则生命周期钩子(startup/shutdown)不会触发相关专题
热门下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习