我已经弄清楚如何让 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/