代码之家  ›  专栏  ›  技术社区  ›  kramer65

如何在Python中检查函数修饰符

  •  2
  • kramer65  · 技术社区  · 9 年前

    我正在使用(真棒) Flask framework 其中一些路线受 flask-login @login_required 像这样的装饰者:

    @app.route('/awesomepage')
    @login_required  # <-- this is what I mean
    def awesome_page():
        return render_template('awesome.html')
    

    当某人注销时,他通常会被重定向到他按下注销时正在查看的页面。但是,当一个人从某个页面注销时,他需要登录(即 @需要登录名 decorator)在注销后收到401未授权错误。因此,当将用户重定向回原始页面时,我想检查他们来自的页面是否具有 @需要登录名 decorator,如果是,则将它们重定向到首页。

    我当前的注销视图如下所示:

    @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 有一个 @需要登录名 室内装修设计师有人知道我该怎么做吗?欢迎提供所有提示!

    1 回复  |  直到 7 年前
        1
  •  3
  •   Martijn Pieters    9 年前

    你不可能,也不容易。

    更好的选择是告诉页面包含更好的 next 通过显式设置 login_required 模板中的标志:

    @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 %}
    

    另一种方法是定义登录视图 需要登录名 重定向到该视图。那个 能够 成为您的索引页。

    另一种方法是创建一个增强的 需要登录名 decorator,它设置一个全局变量,然后对其进行测试:

    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 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 %}