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」デコレータ不足でした。
参考にするサイトによっては記述されてなかったりして、他にもハマる人いそうです。
参考にしたサイト
下記のサイトを参考にさせて頂きました。
Python と Flask で RESTful API を開発する
Python と Flask で RESTful API を開発する方法を学びましょう。
Flaskでデコレーターを使うとうまく動かなかった件とその対策 - やつらかやつらだ
Flaskでデコレーターを使う方法を調べてみた。発端 Flaskでデコレーターを使ってみた うまく動いてる パスを増やした あれ?全部のパスで同じ関数呼ばれてない!? もしかしてデコレーター使えないの!? ちょっと検索するとFlaskでデコ...
![](https://i0.wp.com/qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?resize=160%2C90&ssl=1)
Pythonのデコレータについて - Qiita
今回は、Pythonデコレータについて話そうと思います。はじめに。エキスパートPythonプログラミング^expart_pythonに沿って勉強していた際に、Pythonのデコレーターという概念…
以上です。
コメント