LoginSignup
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-16

概要

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

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0