如何在Python中检查函数装饰器
我正在使用(awesome)构建一个网站,其中一些路由由如何在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()
@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:我添加了一个客户我是你的装饰选择。太棒了!完全解决了整个问题。万分感谢!