Django
を使用したシステム開発で middleware
(ミドルウェア)を独自で作成する機会があったので、その時の実装方法を説明したいと思います。
middleware (ミドルウェア)とは
下記のサイトに詳細が記載されているので、興味がある人は見てみてください。
ミドルウェアは、Django のリクエスト/レスポンス処理にフックを加えるためのフレームワークです。これは、Django の入力あるいは出力をグローバルに置き換えるための、軽量で低レベルの「プラグイン」システムです。
とあるようにミドルウェアを利用することでリクエスト/レスポンス処理にフックを加えることができるようになります。
今回は Django
のチュートリアルに Middleware
クラスを追加する形で実装しています。
こちらに完成したソース置いてありますので、参考までにどうぞ!
では、実際の利用方法を説明していきます。
Middleware クラスの実装
Middleware
クラスを実装していきます。まず Middleware
クラスを実装するためのファイルを追加します。
# middleware.py
追加したファイルに下記のように Middleware
クラスを実装します。
今回はリクエストが view に処理される前とレスポンスがクライアントに返る前に文字列をログ出力するだけの Middleware
を実装します。
# middleware.py
class SampleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 前処理
self.process_request(request)
# ビューの処理
response = self.get_response(request)
# 後処理
self.process_response(request, response)
return response
def process_request(self, request):
print("リクエスト")
def process_response(self, request, response):
print("レスポンス")
Middleware クラスを settings.py に追加する
実装した Middleware
クラスを settings.py
の MIDDLEWARE
に追加します。
# settings.py
MIDDLEWARE = [
...
'mysite.middleware.SampleMiddleware',
]
動作確認
では、実際にどのような動作になるか runserver
コマンドを実行して動かしてみます。
$ python manage.py runserver
http://localhost:8000/polls/create/
にアクセスしてみます。
すると以下のようにログが出力されます。
System check identified no issues (0 silenced).
March 31, 2020 - 02:38:13
Django version 2.1.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
リクエスト
レスポンス
[31/Mar/2020 02:39:08] "GET /polls/create/ HTTP/1.1" 200 4478
「リクエスト」と「レスポンス」の文字列が出力されていることが確認できました!
使いどころは?
では、この Middleware
クラスですが、どんな時に使えばいいかというと・・・
メンテナンス時にメンテナンス画面へ飛ばす
リクエストが来た時点でメンテナンスフラグなどを確認して、メンテナンス中であればメンテナンス画面へ遷移させるような使い方ができます。
追加情報の入力を促す
ユーザ情報登録後などに、追加で情報の登録が必要な場合などに、アクセスしてきたユーザ情報を参照し、情報が不足していたら追加情報登録画面などに遷移させることができます。(商品の決済をカードで行おうとしているのに、カード情報が入力されてない場合など?)
上記以外にもシステム共通でチェックを行たい場合にも Middleware
を使うことができると思います。
最後に
Middleware
クラスの実装ができるようになればシステム共通なチェックなど、いろいろなことがリクエストの処理前もしくはレスポンス返却前に実装できるようになります。これで View
クラスに何度も同じ処理を実装する手間も無くなったりするので生産性向上に寄与することができると思います。
積極的に Middleware
クラスを活用していきたいですね。
コメント