71

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

@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,因为如果我不这样做,服务器将进入无限循环。

4

3 回答 3

102

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

@app.before_request
def before_request():
    if 'logged_in' not in session and request.endpoint != 'login':
        return redirect(url_for('login'))
于 2013-01-16T21:52:50.583 回答
24

您可以使用装饰器。以下示例展示了如何在特定请求之前检查 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
于 2015-10-07T19:22:16.710 回答
10

这是使用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()
于 2016-02-14T01:18:11.323 回答