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

如何精简Flask中多个高度相似的@wraps权限校验装饰器代码

你可以通过带参数的装饰器工厂来统一封装重复逻辑,所有装饰器仅权限校验的key不同,把这个值作为参数传入工厂函数动态生成对应装饰器即可,不需要重复写多套几乎完全相同的逻辑。

实现代码

# 通用权限装饰器工厂
def permission_required(permission_key):
    def decorator(func):
        @wraps(func)
        def decorated_view(*args, **kwargs):
            if request.method in EXEMPT_METHODS:
                return func(*args, **kwargs)
            elif current_app.config.get('LOGIN_DISABLED'):
                return func(*args, **kwargs)
            elif not current_user.is_authenticated or not current_user["Keys"][permission_key]:
                return current_app.login_manager.unauthorized()
            return func(*args, **kwargs)
        return decorated_view
    return decorator

使用方式

方式1:预先定义对应权限的装饰器别名(兼容你原来的写法,不需要修改视图函数上的装饰器调用)

a_required = permission_required("A")
b_required = permission_required("B")
# 剩下3个权限直接按上述格式新增即可

方式2:直接在视图函数上传入权限key使用(不需要提前定义别名)

@app.route("/page-a")
@permission_required("A")
def page_a_view():
    # 视图业务逻辑
    pass

使用时注意传入的权限key要和current_user["Keys"]里存储的键名完全匹配即可。改造后原来近百行的冗余代码可以压缩到20行以内,后续新增权限也不需要再写重复的装饰器逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:45:03