33. FastAPI 依赖注入_全局级
全局依赖覆盖应用的路径操作
在 FastAPI(dependencies=[...]) 中设置的依赖,会加入该应用的路径操作。适合全局租户检查、统一请求约定等确实适用于所有业务接口的规则。
可运行示例
python
from typing import Annotated
from fastapi import Depends, FastAPI, Header, HTTPException
def require_tenant(
x_tenant_id: Annotated[str | None, Header()] = None,
):
if x_tenant_id is None or not x_tenant_id.strip():
raise HTTPException(400, "缺少租户标识")
return x_tenant_id
app = FastAPI(dependencies=[Depends(require_tenant)])
@app.get("/users")
def users():
return {"resource": "users"}
@app.get("/products")
def products():
return {"resource": "products"}保存为 main.py 并启动。两个接口不带 X-Tenant-ID 均返回 400;带头则成功。本例只是检查存在性,真实租户隔离还必须验证用户与租户关系,并将可信租户条件加入数据库查询。
不是所有 ASGI 请求都会走它
自动文档、OpenAPI 路由、静态文件挂载和独立子应用不能笼统地认为都受这个依赖保护。若需要保护文档,使用专门配置、受控文档入口或网关规则,并实际测试;不要只看到全局依赖就断言所有路径都已认证。
全局依赖返回值不会自动成为所有路由的函数参数。需要租户值时仍应显式声明参数依赖,或在一套清楚的上下文方案中读取。
健康检查如何例外
若探针必须公开,就不要把认证盲目放到应用全局。更合适的组织是:公开 /health 放独立路由,全部业务 API 放 APIRouter(dependencies=[...])。这能让覆盖范围从代码结构上清楚可见。
全局、路由级、路径级并没有“后者覆盖前者”的继承优先级。多层依赖通常累加;公共接口需要通过结构分离,而不是寄希望于在下层写空列表来移除上层要求。
和中间件怎么选
依赖更贴近参数验证、业务资源和用户身份,也能进入 OpenAPI 参数描述;中间件围绕请求响应流程,适合全局日志、CORS 和协议层处理。数据库 Session、当前用户通常使用依赖。
练习:访问 /docs 与业务接口,检查两者对租户头的实际要求;重新组织成“公开探针 + 受保护业务路由”,明确记录安全覆盖范围。