我已经尽我所能地尝试了这项工作,每种方法由于不同的原因而失败。
我正在使用Flask-Login来管理用户。我想制作一个自定义装饰器,使我可以检查用户角色。我看过Implementing Flask-Login with multiple User Classes,但无法使用。我还查看了Decorators with parameters?和大量其他链接,无论我做什么,我都无法匹配在教程和堆栈溢出答案中发现的行为。
所以这是一个尝试:
def check_role(f):
@wraps(f)
def decorated_view(*args, **kwargs):
print(f)
return f(*args, **kwargs)
return decorated_view
这可以工作并打印我装饰的函数的名称,但是它不接受“ role”参数供我检查。如果我添加:
def check_role(f, a="test"):
@wraps(f)
def decorated_view(*args, **kwargs):
print(f)
return f(*args, **kwargs)
return decorated_view
,然后将其用于:
@bp.route('/topicManagement', methods=('GET', 'POST'))
@login_required
@check_role(a="foo")
我得到“ TypeError:check_role()缺少1个必需的位置参数:'f'”。我已经尝试过使用位置,可选参数的所有组合,但我无法超越。该功能不需要我手动在代码中传递“ f”,直到我按照每个教程都告诉您的方式添加参数,然后由于需要提供功能参数而使其中断,但是当我尝试提供任何功能时会出错作为现在突然需要的参数。
然后从Decorators with parameters?开始,我尝试执行以下操作:
def check_role(a):
def bar(function):
def foo(*args, **kwargs):
print(a)
return function(*args, **kwargs)
return foo
return bar
无论我在这里做什么,无论名字或装饰了多少个视图函数,我总会得到相同的结果:
无法为端点“”构建URL。你是说“”吗?
谢谢堆栈溢出,您是我唯一的希望。