Django Logo

[Django]middleware(ミドルウェア)を自作する

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.pyMIDDLEWARE に追加します。

# settings.py
MIDDLEWARE = [
    ...
    'mysite.middleware.SampleMiddleware',
]

動作確認

では、実際にどのような動作になるか runserver コマンドを実行して動かしてみます。

$ python manage.py runserver

http://localhost:8000/polls/create/ にアクセスしてみます。

Django Middleware 1

すると以下のようにログが出力されます。

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 クラスを活用していきたいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です