Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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,我正在使用(awesome)构建一个网站,其中一些路由由@login\u required装饰程序保护,如下所示: @app.route('/awesomepage') @login_required # <-- this is what I mean def awesome_page(): return render_template('awesome.html') @app.route('/logout') def logout(): logout_user()

我正在使用(awesome)构建一个网站,其中一些路由由
@login\u required
装饰程序保护,如下所示:

@app.route('/awesomepage')
@login_required  # <-- this is what I mean
def awesome_page():
    return render_template('awesome.html')
@app.route('/logout')
def logout():
    logout_user()
    next_url = request.args.get('next') or request.referrer or url_for('index')
    return redirect(next_url)

因此,在这段代码中,我想检查
request.referer
是否需要
@login\u
装饰器。有人知道我怎么做吗?欢迎所有提示

你不能,也不容易

更好的选择是通过在模板中明确设置
login\u required
标志,告诉页面在注销链接中包含更好的
next
值:

@app.route('/awesomepage')
@login_required
def awesome_page():
    return render_template('awesome.html', login_required=True)
并使用以下内容呈现注销链接:

{%if login\u required%}{{url\u for('logout',next=url\u for('index'))}
{%else%}{{url_for('logout'}}{%endif%}
另一种方法是定义一个登录视图,并将
login\u required
重定向到该视图。这可能是您的索引页

另一种方法是创建一个增强的
登录\u required
装饰器,该装饰器设置一个全局值,然后测试:

from functools import wraps

from flask import g
from flask_login import login_required

def my_login_required(f):
    @login_required
    @wraps(f)
    def wrapped(*args, **kwargs):
        g.login_required = True
        return f(*args, **kwargs)
    return wrapped
然后在视图上使用该装饰器,而不是Flask登录版本:

@app.route('/awesomepage')
@my_login_required
def awesome_page():
    return render_template('awesome.html')
并更新模板以查找全局:

{%if g.login\u required%}{{url\u for('logout',next=url\u for('index'))}
{%else%}{{url_for('logout'}}{%endif%}

难道你不能通过将用户重定向到那里而不是抛出401来避免这个问题吗?如果所有修饰的方法都在一个类中,你可以查找它们的第一行代码的行号,这些代码在修饰后会发生变化,但这是一种非常奇怪的做法:)基本上,您可以保留一个与装饰函数代码的第一行号相对应的行号字典,然后使用它来“映射”好主意,但这会因为重复而留下错误的空间。如果我随后更改、删除或添加一个
@login\u required
,我必须始终记住在render\u模板中也要更改
login\u required=True
。没有其他方法可以自动完成吗?@kramer65:我添加了一个客户我是你的装饰选择。太棒了!完全解决了整个问题。万分感谢!