- FastAPI 教程
- FastAPI - 首页
- FastAPI - 简介
- FastAPI - Hello World
- FastAPI - OpenAPI
- FastAPI - Uvicorn
- FastAPI - 类型提示
- FastAPI - IDE 支持
- FastAPI - REST 架构
- FastAPI - 路径参数
- FastAPI - 查询参数
- FastAPI - 参数验证
- FastAPI - Pydantic
- FastAPI - 请求体
- FastAPI - 模板
- FastAPI - 静态文件
- FastAPI - HTML 表单模板
- FastAPI - 访问表单数据
- FastAPI - 上传文件
- FastAPI - Cookie 参数
- FastAPI - 头部参数
- FastAPI - 响应模型
- FastAPI - 嵌套模型
- FastAPI - 依赖注入
- FastAPI - CORS
- FastAPI - CRUD 操作
- FastAPI - SQL 数据库
- FastAPI - 使用 MongoDB
- FastAPI - 使用 GraphQL
- FastAPI - Websockets
- FastAPI - FastAPI 事件处理器
- FastAPI - 挂载子应用
- FastAPI - 中间件
- FastAPI - 挂载 Flask 应用
- FastAPI - 部署
- FastAPI 有用资源
- FastAPI - 快速指南
- FastAPI - 有用资源
- FastAPI - 讨论
FastAPI - 依赖注入
FastAPI 内置的依赖注入系统使得在构建 API 时更容易集成组件。在编程中,**依赖注入**指的是一个对象接收其依赖的其他对象的一种机制。这些其他对象称为依赖项。依赖注入具有以下优点:
重用相同的共享逻辑
共享数据库连接
强制执行身份验证和安全功能
假设一个 FastAPI 应用有两个操作函数,它们都具有相同的查询参数 id、name 和 age。
from fastapi import FastAPI app = FastAPI() @app.get("/user/") async def user(id: str, name: str, age: int): return {"id": id, "name": name, "age": age} @app.get("/admin/") async def admin(id: str, name: str, age: int): return {"id": id, "name": name, "age": age}
如果需要进行任何更改,例如添加/删除查询参数,则需要更改两个路由装饰器和函数。
FastAPI 提供了**Depends**类,其对象在这种情况下用作通用参数。首先从 FastAPI 中导入**Depends**并定义一个函数来接收这些参数:
async def dependency(id: str, name: str, age: int): return {"id": id, "name": name, "age": age}
现在,我们可以将此函数的返回值用作操作函数中的参数。
@app.get("/user/") async def user(dep: dict = Depends(dependency)): return dep
对于每个新的请求,FastAPI 使用相应的参数调用依赖函数,返回结果,并将结果分配给您的操作。
您可以使用类来管理依赖项而不是函数。声明一个类,其中 id、name 和 age 作为属性。
class dependency: def __init__(self, id: str, name: str, age: int): self.id = id self.name = name self.age = age
将此类用作参数的类型。
@app.get("/user/") async def user(dep: dependency = Depends(dependency)): return dep @app.get("/admin/") async def admin(dep: dependency = Depends(dependency)): return dep
在这里,我们在操作函数中使用了依赖注入。它也可以用作操作装饰器。例如,我们想检查查询参数 age 的值是否小于 21。如果是,则应抛出异常。因此,我们编写一个函数来检查它并将其用作依赖项。
async def validate(dep: dependency = Depends(dependency)): if dep.age > 18: raise HTTPException(status_code=400, detail="You are not eligible") @app.get("/user/", dependencies=[Depends(validate)]) async def user(): return {"message": "You are eligible"}
在 FastAPI 依赖项管理中,您可以使用 yield 而不是 return 来添加一些额外的步骤。例如,以下函数使用带有 yield 的数据库依赖项。
async def get_db(): db = DBSession() try: yield db finally: db.close()
广告