python - 如何检查Python中的函数装饰器

标签 python flask decorator python-decorators flask-login

我正在使用(很棒的)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/

相关文章:

python - numpy 写入数组的排列版本

python - 将 transaction.commit_manually() 升级到 Django > 1.6

python - 如何通过月份名称查询sqlalchemy

javascript - 根据按下的字段使用 Jinja2 和 Flask 对对象列表进行排序

python - 识别等效的可变参数函数调用以进行内存

c# - 延迟执行中装饰器序列有什么用?

python - 通过 python paramiko 使用本地参数在 ssh 连接上执行受限远程脚本

python - Flask 应用程序带有 "submodules"

javascript - Angular : Why lazy-loading a decorator doesn't work?

python - 如何使用 numpy.vectorize() 修复广播问题