Python 为什么我的装饰师会因为这个端点而崩溃?
我已经了解了如何使Flask登录基于LDAP查找对用户进行身份验证。现在,我想在混合中添加一些授权-也就是说,仅当用户同时登录并且属于正确的组时,才允许访问某些端点 我不确定这是否是正确的方法,但我想我可以在端点上添加一个装饰:Python 为什么我的装饰师会因为这个端点而崩溃?,python,flask,decorator,python-decorators,flask-login,Python,Flask,Decorator,Python Decorators,Flask Login,我已经了解了如何使Flask登录基于LDAP查找对用户进行身份验证。现在,我想在混合中添加一些授权-也就是说,仅当用户同时登录并且属于正确的组时,才允许访问某些端点 我不确定这是否是正确的方法,但我想我可以在端点上添加一个装饰: @app.route('/top_secret') @authorize @login_required def top_secret(): return render_template("top_secret.html") 并且(目前)制作一个完全通过的装饰
@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 decorator的情况下运行它可以正常工作
所以我不确定我哪里出错了。我可以不这样装饰端点吗?如果没有,授权步骤应该在哪里进行?(这必须在@login\u required完成它需要做的事情之后进行)啊,是的,非常简单
from functools import wraps
def authorize(func):
@wraps(func)
def newfunc(*args, **kwargs):
return func(*args, **kwargs)
return newfunc
要了解为什么需要使用包装
,可以执行以下操作:
print(top_secret)
一次带包装,一次不带包装。使用wraps,您将看到如下内容:
<function top_secret at 0x7ff165150840>
没有它,您将看到:
<function authorize.<locals>.newfunc at 0x7f81b8456840>
这确实很好,但基本上,当您在默认情况下包装一个函数时,您会丢失docstring、属性和所有其他内容。因此,您失去了功能的app.route
装饰,因此Flask无法确定如何构建URL
通过在那里添加
包装
装饰程序,您可以恢复app.route
对您的功能所做的一切,Flask可以创建您的路线。啊,是的,非常简单
from functools import wraps
def authorize(func):
@wraps(func)
def newfunc(*args, **kwargs):
return func(*args, **kwargs)
return newfunc
要了解为什么需要使用包装
,可以执行以下操作:
print(top_secret)
一次带包装,一次不带包装。使用wraps,您将看到如下内容:
<function top_secret at 0x7ff165150840>
没有它,您将看到:
<function authorize.<locals>.newfunc at 0x7f81b8456840>
这确实很好,但基本上,当您在默认情况下包装一个函数时,您会丢失docstring、属性和所有其他内容。因此,您失去了功能的app.route
装饰,因此Flask无法确定如何构建URL
通过添加
wrapps
装饰程序,您可以恢复app.route
对您的函数所做的一切,Flask可以创建您的路由。Wayne,如果您有时间,我有一个后续问题。韦恩,如果你有时间的话,我有一个后续问题。