【问题标题】:flask before request - add exception for specific route请求前烧瓶 - 为特定路线添加例外
【发布时间】:2012-12-31 08:06:02
【问题描述】:

before_request() 函数(如下)中,如果用户尚未登录,我想将用户重定向到/login。是否有一个特殊变量可以为我提供当前 URL,如下例所示有吗?

@app.before_request
def before_request():
    # the variable current_url does not exist
    # but i want something that works like it
    if (not 'logged_in' in session) and (current_url != '/login'):
        return redirect(url_for('login'))

我需要检查当前 URL 是否为/login,因为如果我不这样做,服务器将进入无限循环。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    您可以使用装饰器。以下示例展示了如何在特定请求之前检查 API 密钥:

    from functools import wraps
    
    def require_api_key(api_method):
        @wraps(api_method)
    
        def check_api_key(*args, **kwargs):
            apikey = request.headers.get('ApiKey')
            if apikey and apikey == SECRET_KEY:
                return api_method(*args, **kwargs)
            else:
                abort(401)
    
        return check_api_key
    

    你可以使用它:

    @require_api_key
    

    【讨论】:

    • 从 functools 导入包装
    • 这里的api_method 是什么?
    • 这是您要包装和检查api密钥的方法。
    • 我相信正确的术语是装饰器。它们是类似于 Java 接口的非常棒的东西
    【解决方案2】:

    您可以检查请求对象上的几个属性,记录在案的hererequest.path 可能就是您想要的。我可以建议request.endpoint,所以如果您决定将您的视图路由到另一个网址或多个网址,您将被覆盖

    @app.before_request
    def before_request():
        if 'logged_in' not in session and request.endpoint != 'login':
            return redirect(url_for('login'))
    

    【讨论】:

    • 我正在尝试做一些非常相似的事情,并且确实在尝试使用 request.endpoint,但我发现该属性只出现在我的两条路线上('/' 和 '/关于/')。对于所有其他路由, request.endpoint 是 None 并且在检查请求对象时, url_rule 甚至不存在?我所有的路由都使用 app.router 装饰器以相同的方式定义。任何想法可能会发生什么?感谢您的帮助
    • 我需要添加 and request.endpoint != 'static' 才能在最新的烧瓶开发代码的开发服务器下正常工作
    • +1 用于检查请求的端点是否为'login',否则会发生一些重定向循环。 :-)
    • 如果有人想知道端点的处理是什么,这是对 Flask 路由的一个很好的解释:stackoverflow.com/a/19262349/593487
    • 注意,要访问实际功能,您可以使用current_app.view_functions[request.endpoint]。这样就可以实现 @auth_exempt 装饰器,它会在视图函数上设置一个属性,以及一个 before_request 处理程序来检查这个属性。
    【解决方案3】:

    这是flask-login 接受答案的实现:

    @app.before_request
    def require_authorization():
        from flask import request
        from flask.ext.login import current_user
    
        if not (current_user.is_authenticated or request.endpoint == 'login'):
            return login_manager.unauthorized()
    

    【讨论】:

    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多