2017-10-03 5 views
0

私のカスタムミドルウェアのリクエスト変数に変数を追加しようとしています。後でその変数にアクセスしたいと思っています。 - CommonMiddlewareDjango:ミドルウェアで設定された変数にアクセスできない

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'page.middleware.DomainInterceptMiddleware', # 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

views.py

def index(request): 
    output = request.myvar 
    return HttpResponse(output) 
上にこれを追加した

middleware.py

class DomainInterceptMiddleware(object): 
    def process_request(self, request): 
     request.myvar = 'whatever' 

settings.py:ここで関連ビットであります

はしかし、/indexにアクセスしようとする上で、私はこのエラーに私が間違っているつもりです

File "/path/to/views.py", line 32, in index 
    output = request.myvar 
AttributeError: 'WSGIRequest' object has no attribute 'myvar' 

を取得しますか?

答えて

2

あなたの現在のミドルウェアクラスは、古いMIDDLEWARE_CLASSES設定用に書かれています。

MIDDLEWARE設定を使用しているため、new-style middleware(Django 1.10+)と記述する必要があります。

下位互換性が必要な場合は、MiddlewareMixindjango.utils.deprecationから使用できます。

from django.utils.deprecation.MiddlewareMixin 

class DomainInterceptMiddleware(MiddlewareMixin): 
    def process_request(self, request): 
     request.myvar = 'whatever' 

また、新しいスタイルのミドルウェアに変換することもできます。

class DomainInterceptMiddleware(object): 
    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     request.myvar = 'whatever' 
     response = self.get_response(request) 
     return response 

詳細はwriting your own middlewareのドキュメントを参照してください。

関連する問題