プログラミング

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

プログラミング
この記事は約4分で読めます。
スポンサーリンク

middleware(ミドルウェア)を独自で作成する機会があったので、その時の実装方法を説明したいと思います。

スポンサーリンク

middleware(ミドルウェア)とは

下記のサイトに詳細が記載されているので、興味がある人は見てみてください。

ミドルウェア (Middleware) | Django ドキュメント | Django

ミドルウェアは、Django のリクエスト/レスポンス処理にフックを加えるためのフレームワークです。これは、Django の入力あるいは出力をグローバルに置き換えるための、軽量で低レベルの「プラグイン」システムです。

とあるようにミドルウェアを利用することでリクエスト/レスポンス処理にフックを加えることができるようになります。

今回はDjangoのチュートリアルにMiddlewareクラスを追加する形で実装しています。

こちらに完成したソース置いてありますので、参考までにどうぞ!

koichi-ezato/mysite
Contribute to koichi-ezato/mysite development by creating an account on GitHub.

では、実際の利用方法を説明していきます。

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/にアクセスしてみます。

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

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

スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました