烧瓶定制装饰

时间:2019-10-01 14:55:41

标签: python flask decorator

我已经尽我所能地尝试了这项工作,每种方法由于不同的原因而失败。

我正在使用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。你是说“”吗?

谢谢堆栈溢出,您是我唯一的希望。

0 个答案:

没有答案