如何精简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
相关产品推荐
相关产品推荐

