You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python API授权:如何在Depends方法中传入Request与权限参数

解决FastAPI中依赖注入同时获取Request与自定义权限参数的问题

问题根源在于:直接在Depends中调用check_permission(permission=xxx)时,函数会被立即执行,但此时FastAPI还未注入Request对象,因此会抛出缺少request参数的错误。需要让Depends接收一个能接收Request参数、同时携带自定义权限信息的可调用对象,以下是两种可行方案:

方案一:使用闭包(嵌套函数)

通过外层函数接收权限参数,返回一个内层函数来处理Request注入与权限校验:

from fastapi import Request, Depends

def check_permission(permission: str = ""):
    def inner(request: Request):
        role = request.state.role
        if role not in cache:
            cache[role] = role_service.get_permission_by_role(role)
        permission_list = cache[role]
        return permission_list.find(permission) > -1
    return inner

接口中使用方式不变:

@router.post('/banners', dependencies=[Depends(check_permission(permission=PermissionCodes.ADD_SITE_CONTENT))])
def add_banner(request: Request, file: UploadFile = File(...)):
    # 接口业务逻辑

方案二:使用类依赖

定义一个类,通过构造方法接收权限参数,实现__call__方法处理Request注入与校验:

from fastapi import Request, Depends

class PermissionChecker:
    def __init__(self, permission: str = ""):
        self.permission = permission
    
    def __call__(self, request: Request):
        role = request.state.role
        if role not in cache:
            cache[role] = role_service.get_permission_by_role(role)
        permission_list = cache[role]
        return permission_list.find(self.permission) > -1

接口中使用方式:

@router.post('/banners', dependencies=[Depends(PermissionChecker(permission=PermissionCodes.ADD_SITE_CONTENT))])
def add_banner(request: Request, file: UploadFile = File(...)):
    # 接口业务逻辑

两种方案对比:闭包写法更简洁,适合简单校验场景;类依赖更易扩展,适合需要初始化额外参数或包含复杂逻辑的权限校验场景。

内容的提问来源于stack exchange,提问作者Sweety Kothari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:23