FlaskでWebAPIを作成しているうちに「Filterの様なモノを作って、そこで認証処理をさせたいな」と思い立ちました。

「Python Filter」といった検索ワードで検索してみたのですが、PythonではC#で言うFilterをデコレータと呼ぶそうです。

詳しい使い方に関しては省いて、コードベースで説明していきます。

開発環境
  • Python:3.8.2
  • Flask:1.1.2

デコレータの実装例

from flask import request
from functools import wraps


def requires_auth(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        auth = request.headers.get("Authorization", None)

        # 認証処理

        return func(*args, **kwargs)
    return wrapper

上記がデコレータ本体のコードで、例ではリクエストのAuthorizationヘッダーからトークンを取得しているイメージです。

作成したデコレータを使うには以下の様なコードを書きます。

from flask import Flask
import auth

app = Flask(__name__)
CORS(app)

@ok_module.route("/get", methods=["GET"])
@auth.requires_auth
def get_ok():
    return "OK"

ルーティング用のデコレータの下に、「@(ファイル名).(関数名)」という形式で定義します。

どうやらこのデコレータ、上からではなく下から実行されるようですので、順番にはくれぐれもご注意ください。

上記の実装で、GETリクエスト(/get)の際にデコレータの中身(Authorizationヘッダーの認証処理)が走るようになります。

デコレータの実装でハマったコト

1ファイルの中に複数のエンドポイントを作成し、それぞれにデコレータを付与していたのですが、実行時エラー。

試しに1個だけにしてみたら正常終了。

原因はデコレータ内の「wraps」デコレータ不足でした。

参考にするサイトによっては記述されてなかったりして、他にもハマる人いそうです。

参考にしたサイト

下記のサイトを参考にさせて頂きました。

以上です。

スポンサーリンク