请求前烧瓶 - 为特定路线添加例外

Sea*_*lus 39 python flask

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'))
Run Code Online (Sandbox Code Playgroud)

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

Daz*_*all 68

有一对夫妇的请求对象,你可以检查一下,在案特性在这里,request.path可能是你想要的东西.我可以建议request.endpoint,所以如果您决定将视图发送到另一个网址或多个网址,您将会受到保护

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


sav*_*ion 15

你可以使用装饰器.这是一个示例,说明如何在特定请求之前检查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
Run Code Online (Sandbox Code Playgroud)

你可以用它:

@require_api_key
Run Code Online (Sandbox Code Playgroud)

  • 从 functools 导入包装 (3认同)

Ryn*_*ett 7

这是通过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()
Run Code Online (Sandbox Code Playgroud)