概要
Django2.1で開発中のシステムでミドルウェアを実装した時にディレクトリ構造やファイル名、MiIDDLEWAREへの指定方法で迷ったので記録しておきます。参考になれば幸いです。
- Django 2.1.4
- Python 3.6.7
- django-allauth 0.38.0
- Ubuntu 18.04.2 LTS
参考にした記事
- Django2.1 公式ドキュメント(ミドルウェア)
- how to setup custom middleware in django(stackoverflow)・・・2017年の回答。middleware本体の実装はエラーになるがディレクトリ構造について参考になった
手順
ミドルウェアを配置するアプリケーションを作成します。既存のアプリケーションに入れても問題ありません。
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
以上です。