71

以下の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であるかどうかを確認する必要があります。そうしないと、サーバーが無限ループに陥るからです。

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 に答える