我需要修改中间件中的响应对象,所以我添加了'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
然而,在django的CommonMiddleware等其他中间件中找不到response.status_code。我使用Django 1.4并从文档中,命令process_response是在MIDDLEWARE_CLASSES中定义的顺序的颠倒顺序。所以我把我放在最底层。
我得到了
AttributeError:'dict'对象没有属性'status_code' 来自其他中间件。
(***这与...有关 WebSocket generates error in django common middleware)
答案 0 :(得分:1)
问题是您的中间件正在使用process_response
执行第一个。
process_request
和process_view
方法从列表的顶部到底部执行,但process_response
从底部到顶部执行。从Django文档中查看以下图表:
https://docs.djangoproject.com/en/dev/topics/http/middleware/#hooks-and-application-order
因此,如果您将中间件放在列表中的第一个,它应该可以工作。