覆盖异步阻塞、Pydantic 校验、SQLAlchemy 会话、CORS、依赖注入等 FastAPI 开发常见问题。
async def 端点在事件循环主线程上运行,一旦调了 time.sleep、requests 这类阻塞代码,整个服务连同 /health 一起冻结。本文讲清 def vs async def 的区别和 run_in_threadpool 的正确用法。
前端一直报 No 'Access-Control-Allow-Origin',往往是 CORSMiddleware 没加、allow_origins 漏了前端源、或 allow_origins=['*'] 和 allow_credentials=True 撞一起。另外 allow_methods 默认只有 GET、allow_headers 默认空也是高频坑。
参数漏写 Depends() 会被当成 query 参数报 422;yield 依赖的清理要在 finally 里保证、except 后要 raise;默认依赖结果在同一次请求里缓存,副作用依赖要用 use_cache=False。
接口返回 422 本质是请求体/参数和 Pydantic 模型对不上。本文讲清 detail 里 loc/msg/type 怎么读,以及用 DTO 分离 ORM 模型、处理 camelCase、Optional 字段等常见解法。
每个请求一个 session,用 yield 依赖保证关闭;async 路由里调同步 Session 会阻塞事件循环;session 关闭后再访问懒加载属性会报错。本文讲清这三类坑和对应写法。