class User(BaseModel):
name: str
token: str
fake_db = [
User(name='foo', token='a1'),
User(name='bar', token='a2')
]
async def get_user_by_token(token: str = Header()):
for user in fake_db:
if user.token == token:
return user
else:
raise HTTPException(status_code=401, detail='Invalid token')
@router.get(path='/test_a', summary='Test route A')
async def test_route_a(user: User = Depends(get_user_by_token)):
return {'name': user.name}
@router.get(path='/test_b', summary='Test route B')
async def test_route_a(user: User = Depends(get_user_by_token)):
return {'name': user.name}
我想避免代码重复。是否可以以某种方式设置线路user: User = Depends(get_user_by_token)
对于整个路由器?同时,我需要user
对象在每个方法中可用。
It is very important that the openapi says that you need to specify a header with a token for the method.
您可以使用dependencies
要添加的参数全局依赖创建时router
实例:
router = APIRouter(dependencies=[Depends(get_user_by_token)])
或者,当添加router
to the app
实例:
app.include_router(router, dependencies=[Depends(get_user_by_token)])
请查看 FastAPI 的文档依赖关系更多细节。
至于获取全局依赖的返回值,你实际上不能这样做。解决这个问题的方法是将返回值存储到request.state(如所描述的here),用于存储任意状态(参见实现State以及)。因此,你可以有这样的东西:
def get_user_by_token(request: Request, token: str = Header()):
for user in fake_db:
if user.token == token:
request.state.user = user
# ...
然后,在端点内部,您可以使用以下命令检索用户对象request.state.user
,如中所述这个答案.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)