怎么做淘宝客网站赚钱吗,上传网站的软件,wordpress挂黑页,网页版微信二维码传送助手文章目录 基本概念基本用法复杂场景中的 Depends数据库会话管理处理请求用户嵌套依赖全局依赖 作用域与生命周期可选依赖类依赖总结 基本概念
在 FastAPI 中#xff0c;依赖可以是#xff1a;
一个函数#xff0c;它的返回值会被传递给视图函数作为参数。可以被其他依赖函… 文章目录 基本概念基本用法复杂场景中的 Depends数据库会话管理处理请求用户嵌套依赖全局依赖 作用域与生命周期可选依赖类依赖总结 基本概念
在 FastAPI 中依赖可以是
一个函数它的返回值会被传递给视图函数作为参数。可以被其他依赖函数调用形成依赖链。
基本用法
from fastapi import Depends, FastAPIapp FastAPI()def common_parameters(q: str None, skip: int 0, limit: int 10):return {q: q, skip: skip, limit: limit}app.get(/items/)
def read_items(commons: dict Depends(common_parameters)):return commons
在这个例子中common_parameters 函数返回了一个包含常见查询参数的字典Depends 将这个字典注入到 read_items 函数的 commons 参数中。
复杂场景中的 Depends
数据库会话管理
from sqlalchemy.orm import Session
from fastapi import Depends, FastAPIapp FastAPI()def get_db():db SessionLocal()try:yield dbfinally:db.close()app.get(/users/)
def read_users(db: Session Depends(get_db)):return db.query(User).all()
在这个例子中get_db 是一个依赖函数它返回一个数据库会话对象。通过使用 Depends(get_db)read_users 函数在每次请求时会自动获取并使用数据库会话。
处理请求用户
from fastapi import Depends, FastAPI, HTTPException, statusapp FastAPI()def get_current_user(token: str Depends(oauth2_scheme)):user verify_token(token)if not user:raise HTTPException(status_codestatus.HTTP_401_UNAUTHORIZED, detailInvalid authentication credentials)return userapp.get(/users/me)
def read_users_me(current_user: User Depends(get_current_user)):return current_user
在这个例子中get_current_user 是一个依赖函数它负责从请求中提取和验证用户的身份。read_users_me 函数通过 Depends(get_current_user) 自动获取当前的用户对象。
嵌套依赖
def get_current_user(token: str Depends(oauth2_scheme)):# 验证token并返回用户return Userdef get_active_user(current_user: User Depends(get_current_user)):if not current_user.is_active:raise HTTPException(status_code400, detailInactive user)return current_userapp.get(/users/me)
def read_users_me(active_user: User Depends(get_active_user)):return active_user
在这个例子中get_active_user 依赖于 get_current_user而 read_users_me 又依赖于 get_active_user。通过这种方式FastAPI 会自动解析并注入这些依赖。
全局依赖
app FastAPI(dependencies[Depends(verify_token)])
每个请求都会执行 verify_token 函数。
作用域与生命周期 依赖函数的生命周期与请求生命周期相关。比如依赖函数 get_db 中使用 yield 可以管理数据库会话的创建和销毁FastAPI 会在请求结束后自动执行 finally 中的逻辑。 可选依赖
在某些情况下你可能不希望 FastAPI 缓存依赖的结果这样每次调用时都会创建一个新的实例。你可以通过将Depends 的 use_cache 参数设置为 False 来实现这一点。
from fastapi import Depends, FastAPIapp FastAPI()def get_counter():# 每次调用时都会返回一个新的值counter {count: 0}counter[count] 1return counterapp.get(/counter/)
def read_counter(counter: dict Depends(get_counter, use_cacheFalse)):return counter
在这个示例中get_counter 函数每次调用都会返回一个新的计数器对象因为我们将 use_cache 设置为 False。如果 use_cache 为 True默认值那么在同一请求生命周期内依赖的结果会被缓存不会重新调用 get_counter 函数。
类依赖
类依赖允许将依赖逻辑封装到类中从而更好地管理依赖的状态。你可以定义一个类并在类的__call__方法中实现依赖逻辑。
from fastapi import Depends, FastAPIapp FastAPI()class CommonQueryParams:def __init__(self, q: str None, skip: int 0, limit: int 10):self.q qself.skip skipself.limit limitdef __call__(self):return {q: self.q, skip: self.skip, limit: self.limit}app.get(/items/)
def read_items(commons: dict Depends(CommonQueryParams())):return commons
在这个示例中CommonQueryParams 是一个类封装了常见的查询参数。通过实例化 CommonQueryParams 并将其实例传递给 Depends可以在请求处理函数中轻松地获取这些参数。
总结 在 FastAPI 中Depends 是一个用于依赖注入的强大工具它简化了参数传递并增强了代码的可读性和可维护性。依赖可以是一个函数函数的返回值会被自动注入到视图函数的参数中这使得参数的使用更加简洁并且支持形成依赖链即一个依赖函数可以调用其他依赖函数。Depends 的基本用法是在视图函数中通过 Depends 将依赖函数的返回值作为参数注入这种方式不仅简化了代码还允许代码的模块化和重用。 在更复杂的场景中Depends 可以用于管理数据库会话的生命周期通过 yield 可以确保在每个请求中正确打开和关闭数据库会话。此外Depends 还可以用于处理请求用户的身份验证通过依赖注入可以在每个请求中自动验证用户身份并进行权限检查。FastAPI 还支持嵌套依赖这意味着一个依赖可以依赖于另一个依赖形成复杂的依赖关系这种灵活性使得处理复杂的业务逻辑变得更加容易。 Depends 还支持全局依赖设置这允许开发者将某些依赖函数应用到所有的请求中确保每次请求都会执行特定的逻辑。在处理依赖的生命周期时Depends 与请求的生命周期紧密相关通过使用 yield可以有效管理资源的创建和释放。此外Depends 还支持可选依赖通过设置 use_cacheFalse可以在每次请求时生成新的依赖实例避免依赖结果的缓存。 最后Depends 还支持类依赖这允许开发者将依赖逻辑封装在类中通过类的实例来管理复杂的状态和逻辑。这种方式不仅使代码更加模块化还提供了对依赖逻辑更好的控制和扩展性。通过这些技巧和方法开发者可以在 FastAPI 中有效利用 Depends提高代码的灵活性和可维护性尤其在处理复杂业务逻辑时它是一个不可或缺的工具。