为什么我的装饰器会破坏这个 Flask-Login 端点?
Why is my decorator breaking for this Flask-Login endpoint?
我已经弄清楚如何让 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 完成它需要做的事情之后发生)
嗯嗯,超级简单!
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 可以创建您的路由。
我已经弄清楚如何让 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 完成它需要做的事情之后发生)
嗯嗯,超级简单!
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 可以创建您的路由。