Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的装饰师会因为这个端点而崩溃?_Python_Flask_Decorator_Python Decorators_Flask Login - Fatal编程技术网

Python 为什么我的装饰师会因为这个端点而崩溃?

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") 并且(目前)制作一个完全通过的装饰

我已经了解了如何使Flask登录基于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 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,如果您有时间,我有一个后续问题。韦恩,如果你有时间的话,我有一个后续问题。