[英]Override global dependency for certain endpoints in FastAPI
我有一个与 web 应用程序通信的 FastAPI 服务器。 我的 web 应用程序也有两种类型的用户,用户(非管理员)和管理员。 我向 FastAPI 添加了一个全局依赖项来验证用户。 我希望验证依赖项默认情况下只允许管理员访问端点,并有一些装饰器(或类似的东西)来允许非管理员访问某些路由。 这样,没有人会意外地创建一个应该仅供管理员使用的公共路由。
def verify_token(request: Request):
# make sure the user's auth token is valid
# retrieve the user's details from the database
# make sure user is Admin, otherwise throw HTTP exception
return True
app = FastAPI(
title="My App",
dependencies=[Depends(verify_token)]
)
@app.get(/admins_only)
def admins_only():
# this works well!
return {'result': 2}
@app.get(/non_admin_route)
def non_admin_route():
# this doesn't work because verify_token
# only allows admins by default, but it should
# be accessible to non admins
return {'result': 1}
你不能有条件的全局依赖。 您要么在应用程序的所有端点上安装它们,要么在任何一个端点上都没有。 我的建议是将您的端点分成两个路由器,并且只添加到各自路由器的路由。 然后,您可以像这样仅向其中一个路由器添加全局依赖项:
from fastapi import APIRouter, FastAPI, Request, Depends
def verify_token(request: Request):
# make sure the user's auth token is valid
# retrieve the user's details from the database
# make sure user is Admin, otherwise throw HTTP exception
return True
app = FastAPI(
title="My App",
)
only_admin_router = APIRouter(
tags=["forAdmins"],
dependencies=[Depends(verify_token)]
)
all_users_router = APIRouter(tags="forEverybody")
@only_admin_router.get("/admins_only")
def admins_only():
# this will only work if verify doesn't raise.
return {'result': 2}
@all_users_router.get("/non_admin_route")
def non_admin_route():
#this will work for all users, verify will not be called.
return {'result': 1}
app.include_router(only_admin_router)
app.include_router(all_users_router)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.