条件に合うすべてのビューにオプションでkwargを渡すミドルウェアを作成しようとしています。
問題は、ミドルウェアのセットアップ方法の例を見つけることができないことです。私がしたいメソッドをオーバーライドするクラスを見ました、process_view
:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
しかし、このクラスはどこに配置しますか?ミドルウェアアプリを作成し、このクラスをアプリ内に配置してから、settings.middleware
?
持っていない場合は、アプリ内に次の構造に従ってmiddlewareフォルダーを作成する必要があります。
yourproject/yourapp/middleware
フォルダーミドルウェアは、settings.py、urls、templatesと同じフォルダーに配置する必要があります...
重要:ミドルウェアフォルダー内に__init__.py空のファイルを作成することを忘れないでください。アプリがこのフォルダーを認識できるようにします
カスタムミドルウェア用のファイルを作成する必要があります。この例では、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
以下を探す必要があります。
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!これで、すべてのクライアントからのすべてのリクエストがカスタムミドルウェアを呼び出し、カスタムコードを処理します!
わずか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
ミドルウェアクラスMultipleProxyMiddleware
をmiddleware.py
ファイルに追加するだけです。次の参照名を取得します。
MIDDLEWARE = [
'mysite.middleware.MultipleProxyMiddleware',
...
]