Flask を使用していますが、/admin パスの下にあるすべてのものを保護したいと考えています。
どうやってやるの?すべての関数でセッションをチェックするよりも良い方法があると確信しています。
Flask を使用していますが、/admin パスの下にあるすべてのものを保護したいと考えています。
どうやってやるの?すべての関数でセッションをチェックするよりも良い方法があると確信しています。
これを行う最も簡単な方法は、このスニペットで説明されている方法と同様のブループリントを使用することだと思います。次に、URL が で始まる各リクエストの前に実行されるコードをいくつか用意し/admin
、そのコード内で認証を行うことができます。
明らかな方法は、セッションをテストし、認証が失敗した場合に別のページにリダイレクトするデコレーターを作成することです。Python についてどのくらい知っているかわかりませんが、デコレータは、関数を受け取り、別の関数を返す関数です。基本的に、これは関数修飾子です。セッションをチェックするために独自のデコレータを作成する方法を示すデコレータを次に示します。
import functools
def check_session(view):
@functools.wraps(view)
def inner(*args, **kwargs):
if <test for auth>:
return view(*args, **kwargs)
else:
return flask.redirect("/")
return inner
ご覧のとおり、ビュー関数を受け取る関数があり、認証をチェックする inner という新しい関数を定義し、成功した場合は元のビューを呼び出します。この行@functools.wraps(view)
は、デコレータの使用例です。デコレータは、functools.wraps
最初の引数として指定された関数のプロパティをラップする関数を指定します。このデコレーターを使用するには、次のようにビューに適用します。
@app.route("/admin")
@check_session
def admin_view():
return "Top secret"
認証チェックに失敗したユーザーはリダイレクトされ、失敗したユーザーは通常どおりビューを表示できます。デコレーターは下から上に適用されるため、関数の登録を行う他のデコレーター (つまり@app.route
) の後に配置するようにしてください。