1

ミドルウェアの応答オブジェクトを変更する必要があるため、「myproject.common.middlware.ResponseMiddleware」を追加しました

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',  # order matters don't move
'django.middleware.gzip.GZipMiddleware',  # order matters don't move
'django.middleware.locale.LocaleMiddleware',  # order matters don't move
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'myproject.common.middleware.ResponseMiddleware',

)

ただし、私の ResponseMiddleware には、以下のコードがあります。

class ResponseMiddleware(object):
    def process_response(self, request, response):
        if 'status_code' not in response:
            response['status_code'] = 200
        return response

ただし、response.status_code は、django の CommonMiddleware などの他のミドルウェアにはありません。私はDjango 1.4を使用しており、ドキュメントから、process_responseの順序はMIDDLEWARE_CLASSESで定義された順序の逆順です。だから私は私のものを一番下に置きました。

そして私は得る

AttributeError: 'dict' オブジェクトには、他のミドルウェアからの属性 'status_code' がありません。

(*** これは 、django 共通ミドルウェアで WebSocket がエラーを生成することに関連しています)

4

1 に答える 1

1

問題は、ミドルウェアが最初に実行されていることprocess_responseです.

process_requestprocess_viewメソッドはリストの上から下に実行されprocess_responseますが、下から上に実行されます。Django ドキュメントから次のグラフを確認してください。

https://docs.djangoproject.com/en/dev/topics/http/middleware/#hooks-and-application-order

したがって、ミドルウェアをリストの最初に置くと、動作するはずです。

于 2013-03-04T08:55:16.010 に答える