【Django】Middlewareミドルウェアを新たに自分で作成(自作)する方法

2021.09.02 /

【Django】Middlewareミドルウェアを新たに自分で作成(自作)する方法

本記事ではPythonのフレームワークDjangoにおける、Middlewareミドルウェアを自分で作成(自作)してDjangoに組み込む方法について解説していきます。

ミドルウェアはリクエスト/レスポンス処理の前後でフックを加える仕組みです。

Djangoでのミドルウェアについては以下記事をご参照ください。

Djangoには初めから使えるMiddleware(組み込みMiddleware)が多数あります。

この組み込みMiddleware以外にも、自分のWebアプリケーションに合ったMiddlewareを作成し、組み込むことはできます。

本記事を通して以下の知識を学べます。

学べる知識
  • ミドルウェアの自作手順
  • 作成したミドルウェアをWebアプリケーションに追加する方法
  • ミドルウェアのフックポイント

Middleware(ミドルウェア)を自作する手順

ミドルウェアはリクエスト(HttpRequestオブジェクト)を受け取ったとき、レスポンス(HttpResponseオブジェクト)を返すときに一律に実行する処理を定義することができます。

作成しているWebアプリケーションで共通して実行したい処理がある場合は、次の流れでミドルウェアを作成しましょう。

  1. ミドルウェアのスクリプトを作成
  2. 希望するフックポイントに処理を記述
  3. settings.pyのMIDDLEWAREに追加
  4. サーバーを起動し動作確認

1.ミドルウェアのスクリプトを作成

まずはミドルウェアのスクリプトを作成します。スクリプトはアプリケーションフォルダ内に作成します。

アプリケーション直下に作成してもいいですし、フォルダを作成してその中にスクリプトを作成してもいいです。

私の場合

アプリケーションフォルダにmiddlewareフォルダを作成し、ミドルウェアスクリプトはそこに保存するようにしています

作成したスクリプトには以下のベースコードを記入します。

class クラス名:
    def __init__(self, get_response):
        self.get__response = get_response
        # ここに処理を記述すると、サーバーが起動したときのみ実行される

    def __call__(self, request):
        # ここに処理を記述すると、view関数が実行される前に実行される
        response = self.get_response(request)
	# ここに処理を記述すると、view関数が実行された後に実行される
        return response

ミドルウェアにフックポイントの追加として、process_viewやprocess_exceptionといった特殊メソッドを上記のベースコードに追記してもいいです。

2.希望するフックポイントに処理を記述

ミドルウェア用のスクリプトを作成し、ベースコードを記入したら希望するフックポイントに処理を追記してください。

サーバー起動時に実行するのか、view関数が実行される前後に実行するのかで記述する位置が異なります。
よく考えて記述するようにしましょう。

3.settings.pyのMIDDLEWAREに追加

スクリプト内にMiddlewareクラスを作成したら、そのままではそのミドルウェアを利用することはできません。

必ずsettings.pyのMIDDLEWAREに追加しましょう。
次の例ではofficeアプリのmiddlewareフォルダ内にあるmiddleware.pyのMiddlewareMyselfクラスを追加しています。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    …
    'office.middleware.middleware.MiddlewareMyself'  # 追加したミドルウェア
]

追加するミドルウェアは基本的に、組み込みMiddlewareより下に記述します。

注意

ミドルウェアの書き込み順は、リクエスト受け取り時やレスポンス送信時に実行される順番に関係するため、無駄に順番を変更しないようにしましょう

4.サーバーを起動し動作確認

ここまでできたら、最後にサーバーを起動して、動作を確認しましょう。

Middleware(ミドルウェア)の作成例

実際にミドルウェアを作成してみましょう。

ここではミドルウェアが実行されるフックポイントがわかるようなミドルウェアを作成してみます。

ミドルウェアスクリプトsample.pyを作成

まずアプリケーションoffice内にmiddlewareフォルダを作成します。

Django:middlewareフォルダの作成

次にmiddlewareフォルダ内にmiddleware.pyを作成し、ミドルウェアのベースコードを記述します。

各フックポイントに処理を記述

作成したスクリプトには次のコードを記述します。

class MiddlewareMyself:
    def __init__(self, get_response):
        self.get__response = get_response
        print("①サーバー起動時に実行される")

    def __call__(self, request):
        print("②view関数が実行される前に実行される")
        response = self.get_response(request)
        return response
        print("④view関数が実行された後に実行される")

settings.pyにミドルウェアを追加する

プロジェクトフォルダ内のsettings.pyに作成したミドルウェアを追加します。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    …
    'office.middleware.middleware.MiddlewareMyself'  # 追加したミドルウェア
]

サーバーを起動し動作確認

views.pyには次のview関数が記述されているとします。

def index(request):
    print("③view関数を実行")
    return HttpResponse()

サーバーを起動し、リクエストを受け取り、上記のview関数が実行され、レスポンスが返された場合は次のログを出力します。

①サーバー起動時に実行される
②view関数が実行される前に実行される
③view関数を実行
④view関数が実行された後に実行される

再度同じリクエストを受け取ると次のログを出力します。

②view関数が実行される前に実行される
③view関数を実行
④view関数が実行された後に実行される

①のログはサーバー起動時にしか処理されないため、その後のリクエスト受理ではログが表示してないことがわかります。

まとめ

本記事「【Django】Middlewareミドルウェアを新たに自分で作成(自作)する方法」はいかがでしたか。

ミドルウェアを使うことで、view関数での共通処理をミドルウェアに記述するだけで、すべてのview関数に対して実行できるようになります。

可読性の向上やコードの肥大化を抑える効果がありますので、ぜひ使いこなせるようにしてください。