我们正在尝试根据用户的角色和权限授权 API,有方法可以根据用户的角色和他尝试访问的内容进行检查
def check_permission(request: Request , permission:str=""):
role=request.state.role
if role not in cache:
cache[role] = role_service.get_permission_by_role(role)
permission_list=cache[role]
index=permission_list.find(permission)
return index > -1
& API 中
@router.post('/banners',dependencies=[Depends(check_permission(permission=PermissionCodes.ADD_SITE_CONTENT))])
def add_banner(request:Request,file: UploadFile = File(...)):
但它没有显式传递请求参数并抛出异常 TypeError: check_permission() 缺少 1 个必需的位置参数: 'request'
如何在 check_permission 方法中传递请求+permission_code?
原因是您正在调用 check_permission,您没有将函数本身添加为依赖项 - 只是添加它返回的内容。您想要从
check_permission
返回一个函数,该函数又将 request: Request
作为其参数之一:
from fastapi import Depends, FastAPI, Request
app = FastAPI()
def check_permission(permission: str):
def permission_checker(request: Request):
print(request)
return permission
return permission_checker
@app.get("/", dependencies=[Depends(check_permission("admin"))])
async def read_items():
return "foo"
输出:
INFO: Application startup complete.
<starlette.requests.Request object at 0x000001FE03554FD0>
INFO: 127.0.0.1:54114 - "GET / HTTP/1.1" 200 OK