python - 为什么我的装饰器会破坏这个 Flask-Login 端点?

标签 python flask decorator python-decorators flask-login

我已经弄清楚如何让 Flask-Login 根据 LDAP 查找对用户进行身份验证。现在,我想为组合添加一些授权 - 也就是说,仅当用户登录后才允许访问某些端点并且属于正确的组。

我不确定这是否是正确的方法,但我认为我可以向端点添加装饰:

@app.route('/top_secret')
@authorize
@login_required
def top_secret():
    return render_template("top_secret.html")

并且(现在)制作一个完全直通的装饰器:

def authorize(func):
    def newfunc(*args, **kwargs):
        return func(*args, **kwargs)
    return newfunc

但是运行这个会报错:

werkzeug.routing.BuildError: Could not build url for endpoint 'top_secret'.

在没有 @authorize 装饰器的情况下运行它时工作正常。

所以我不确定我哪里出错了。我不能这样装饰端点吗?如果不是,授权步骤应该在哪里进行? (它必须在@login_required 完成它需要做的事情之后发生)

最佳答案

啊,是的, super 简单!

from functools import wraps


def authorize(func):
    @wraps(func)
    def newfunc(*args, **kwargs):
        return func(*args, **kwargs)
    return newfunc

要了解为什么需要 wraps,您可以这样做:

 print(top_secret)

一次有包裹,一次没有。使用包装,您会看到类似这样的内容:

<function top_secret at 0x7ff165150840>

没有它,你会看到:

<function authorize.<locals>.newfunc at 0x7f81b8456840>

documentation for wraps 真的很好,但基本上当你默认包装一个函数时,你会丢失文档字符串、属性和所有其他内容。所以你丢失了函数的 app.route 装饰,所以 Flask 无法弄清楚如何构建 URL。

通过在其中添加 wraps 装饰器,您可以恢复 app.route 对您的函数执行的所有操作,并且 Flask 可以创建您的路由。

关于python - 为什么我的装饰器会破坏这个 Flask-Login 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36361597/

相关文章:

python - 使用Python将子节点输出到CSV

flask - jinja 是否支持宏中的多个 block ?

python - 为什么Flask本地使用5000端口,部署时使用80端口?

javascript - 为什么这个 javascript 装饰函数不起作用?

python - python 中的协程

python - 对象的工厂方法 - 最佳实践?

python - 没有 Pyramid 的变色龙宏

python - django forms.CharField 如何生成所需的输入?

python - 如何正确初始化 XGBRegressor 的子类?

python - 使用 Flask 运行 keras 预测会出错