FlaskでWebAPIを作成しているうちに「Filterの様なモノを作って、そこで認証処理をさせたいな」と思い立ちました。
「Python Filter」といった検索ワードで検索してみたのですが、PythonではC#で言うFilterをデコレータと呼ぶそうです。
詳しい使い方に関しては省いて、コードベースで説明していきます。
- Python:3.8.2
- Flask:1.1.2
デコレータの実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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ヘッダーからトークンを取得しているイメージです。
作成したデコレータを使うには以下の様なコードを書きます。
1 2 3 4 5 6 7 8 9 10 |
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」デコレータ不足でした。
参考にするサイトによっては記述されてなかったりして、他にもハマる人いそうです。
参考にしたサイト
下記のサイトを参考にさせて頂きました。
Python と Flask で RESTful API を開発する方法を学びましょう。
Flaskでデコレーターを使う方法を調べてみた。発端 Flaskでデコレーターを使ってみた うまく動いてる パスを増やした あれ?全部のパスで同じ関数呼ばれてない!? もしかしてデコレーター使えないの!? ちょっと検索するとFlaskでデコレーターを使う方法は見つかったんだけど、どういう理屈なのかの説明は見つけられなかったので調べてみた。こういう物事を説明するのは絶望的に下手なんだけど調べた以上は書き留めたくて。。 でもって間違っているかもしれなくて。 問題と対策 ハマったときのコード from flask import Flask app = Flask(__name__) app.debu…
今回は、Pythonデコレータについて話そうと思います。 はじめに。 エキスパートPythonプログラミング1に沿って勉強していた際に、Pythonのデコレーターという概念が出てきました。ちょっと本に書いてある内容では何を言って...
以上です。
スポンサーリンク