Edited at

Django2.1でのカスタムmiddlewareの実装方法


概要

Django2.1で開発中のシステムでミドルウェアを実装した時にディレクトリ構造やファイル名、MiIDDLEWAREへの指定方法で迷ったので記録しておきます。参考になれば幸いです。


  • Django 2.1.4

  • Python 3.6.7

  • django-allauth 0.38.0

  • Ubuntu 18.04.2 LTS


参考にした記事


手順

ミドルウェアを配置するアプリケーションを作成します。既存のアプリケーションに入れても問題ありません。

app_nameは実際のアプリケーション名に置き換えます。

$ python3 manage.py startapp app_name

アプリケーションの下にmiddlewareディレクトリを作成して、その直下に空の __init__.py ファイルを配置します。

$ cd app_name

$ mkdir middleware
$ cd middleware
$ touch __init__.py

middlewareディレクトリ下でクラスを実装します。requestオブジェクトからクライアントのリモートIPをログ出力するコードです。


app_name/middleware/custom_middleware.py


from django.core.exceptions import MiddlewareNotUsed
import logging

class LoggingRemoteIPAddressMiddleware(object):
logger = logging.getLogger('LogginRemoteIPAddressMiddleware')

def __init__(self, get_response):
#raise MiddlewareNotUsed
self.get_response = get_response

def __call__(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
self.logger.info('REMOTE_ADDR={}'.format(ip))
return self.get_response(request)


ここまでで以下のよう構成になってればOKです。

<プロジェクトルート>

└── app_name
└── middleware
├── __init__.py
└── custom_middleware.py

作成したクラスをsettings.pyのMIDDLEWARE定義に追加します。


settings.py


MIDDLEWARE = [
・・・
'app_name.middleware.custom_middleware.LoggingRemoteIPAddressMiddleware',
]

logging設定(出力レベルや書式)によりますが実行すると以下のようなログが得られます。

2019-02-17 00:25:21,076 [INFO] 省略/project/app_name/middleware/custom_middleware.py:71 REMOTE_ADDR=127.0.0.1

以上です。