【问题标题】:Changing response object in django middlware在 django 中间件中更改响应对象
【发布时间】:2013-03-04 07:30:13
【问题描述】:

我需要修改中间件中的响应对象,所以我添加了'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)

【问题讨论】:

    标签: django websocket middleware


    【解决方案1】:

    问题是您的中间件是第一个使用process_response 执行的。

    process_requestprocess_view 方法是从列表的顶部到底部执行的,但 process_response 是从底部到顶部执行的。查看 Django 文档中的以下图表:

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

    因此,如果您将中间件放在列表的第一个位置,它应该可以工作。

    【讨论】:

    • 我最初拥有它,但没有运气。而且我的中间件只有 process_response,所以我不应该把它放在最底层吗?谢谢。
    • 即使它只有process_response,如果你希望它是最后一个执行的,应该是根据文档列表中的第一个。测试很简单:创建另一个中间件,并与它们一起玩,看看哪个先执行。
    • 对于常规的 http 请求,它按预期执行。仍然不确定(在测试中),但这仅不适用于 WebSocket 操作。 stackoverflow.com/questions/14364441/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多