web-dev-qa-db-ja.com

Djangoでカスタムミドルウェアを設定する方法

条件に合うすべてのビューにオプションでkwargを渡すミドルウェアを作成しようとしています。

問題は、ミドルウェアのセットアップ方法の例を見つけることができないことです。私がしたいメソッドをオーバーライドするクラスを見ました、process_view

Class CheckConditionMiddleware(object):  
    def process_view(self, request):  

        return None  

しかし、このクラスはどこに配置しますか?ミドルウェアアプリを作成し、このクラスをアプリ内に配置してから、settings.middleware

65
Atma

最初:パス構造

持っていない場合は、アプリ内に次の構造に従ってmiddlewareフォルダーを作成する必要があります。

yourproject/yourapp/middleware

フォルダーミドルウェアは、settings.py、urls、templatesと同じフォルダーに配置する必要があります...

重要:ミドルウェアフォルダー内に__init__.py空のファイルを作成することを忘れないでください。アプリがこのフォルダーを認識できるようにします

2番目:ミドルウェアを作成する

カスタムミドルウェア用のファイルを作成する必要があります。この例では、IPに基づいてユーザーをフィルタリングするミドルウェアが必要であると仮定し、filter_ip_middleware.pyというファイルを作成しますこのコードを含むmiddlewareフォルダー:

class FilterIPMiddleware(object):
    # Check if client IP is allowed
    def process_request(self, request):
        allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # Authorized ip's
        ip = request.META.get('REMOTE_ADDR') # Get client IP
        if ip not in allowed_ips:
            raise Http403 # If user is not allowed raise Error

       # If IP is allowed we don't do anything
       return None

第三:ミドルウェアを「settings.py」に追加します

以下を探す必要があります。

  • MIDDLEWARE_CLASSES(Django <1.10)
  • MIDDLEWARE(Django> = 1.10)

Settings.py内にミドルウェアを追加する必要があります(最後の位置に追加します)。次のようになります。

MIDDLEWARE = ( #  Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'
    'Django.middleware.common.CommonMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
     # Above are Django standard middlewares

     # Now we add here our custom middleware
     'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware'
)

Done!これで、すべてのクライアントからのすべてのリクエストがカスタムミドルウェアを呼び出し、カスタムコードを処理します!

115
AlvaroAV

わずか2ステップ。 Django2.1で動作します。

1。独自のミドルウェアクラスを作成します。

公式マニュアルから良いデモがあります。

https://docs.djangoproject.com/en/2.1/ref/request-response/#Django.http.HttpRequest.get_Host

    from Django.utils.deprecation import MiddlewareMixin

    class MultipleProxyMiddleware(MiddlewareMixin):
        FORWARDED_FOR_FIELDS = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED_Host',
            'HTTP_X_FORWARDED_SERVER',
        ]

        def process_request(self, request):
            """
            Rewrites the proxy headers so that only the most
            recent proxy is used.
            """
            for field in self.FORWARDED_FOR_FIELDS:
                if field in request.META:
                    if ',' in request.META[field]:
                        parts = request.META[field].split(',')
                        request.META[field] = parts[-1].strip()

2.プロジェクトのMIDDLEWAREリストsetting.pyファイルでミドルウェアクラスを参照します

ミドルウェア参照のルールは、プロジェクトのルートディレクトリからクラスへのパスです。

たとえば、mysiteという名前のプロジェクトでは、ツリーは次のようになります。

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── middleware.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py

ミドルウェアクラスMultipleProxyMiddlewaremiddleware.pyファイルに追加するだけです。次の参照名を取得します。

MIDDLEWARE = [
    'mysite.middleware.MultipleProxyMiddleware',  
     ...
]
3
W.Perrin