我正在使用(很棒的)Flask framework 构建一个网站其中一些路由受到 flask-login 的保护@login_required
装饰器如下所示:
@app.route('/awesomepage')
@login_required # <-- this is what I mean
def awesome_page():
return render_template('awesome.html')
当有人注销时,他通常会被重定向到他按注销时正在查看的页面。但是,当一个人从需要登录的页面注销时(即具有 @login_required
装饰器),他在注销后会收到 401 Unauthorized 错误。因此,当将用户重定向回原始页面时,我想检查他们来自的页面是否有 @login_required
装饰器,如果有,则将他们重定向到首页。
我当前的注销 View 如下所示:
@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.referrer
是否有 @login_required
装饰器。有人知道我该怎么做吗?欢迎所有提示!
最佳答案
你不能,不容易。
更好的选择是通过在模板中显式设置 login_required
标志来告诉页面在注销链接中包含更好的 next
值:
@app.route('/awesomepage')
@login_required
def awesome_page():
return render_template('awesome.html', login_required=True)
并呈现注销链接:
{% if login_required %}{{ url_for('logout', next=url_for('index')) }}
{% else %}{{ url_for('logout' }}{% endif %}
另一种方法是定义一个登录 View ,并让 login_required
重定向到该 View 。那可能是您的索引页。
另一种方法是创建一个增强的 login_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
然后在您的 View 上使用该装饰器而不是 Flask-Login 版本:
@app.route('/awesomepage')
@my_login_required
def awesome_page():
return render_template('awesome.html')
并更新模板以查找全局:
{% if g.login_required %}{{ url_for('logout', next=url_for('index')) }}
{% else %}{{ url_for('logout' }}{% endif %}
关于python - 如何检查Python中的函数装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236384/