'WSGIRequest'对象没有属性'session'

时间:2012-08-02 18:15:50

标签: django django-middleware

我在process_response方法中的自定义中间件中有时会出现此错误。我有以下中间件列表:

MIDDLEWARE_CLASSES = [
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'application.middleware.LastCampaignSessionMiddleware'

所以会话中间件放在我的中间件之前。我在源代码中没有任何del request.session个表达式。 这是process_response方法:

    def process_response(self, request, response):
        if 'last_campaign_id' in request.session and request.session['last_campaign_id']:
            if request.COOKIES['last_campaign_id'] != request.session['last_campaign_id']:
                response.set_cookie('last_campaign_id', request.session['last_campaign_id'])
        return response

不确定为什么会发生这种情况。

编辑03-08-2012 12-30

它看起来像浏览器请求favicon:

[03/Aug/2012 10:26:42] "GET /favicon.ico/ HTTP/1.1" 404 6701

django中没有默认行为来解析这个网址吗?因为我没有明确指定应该处理此请求的视图。我不在页面源代码中使用favicon。所以我想这是浏览器请求/favicon.ico。我想如果404错误HttpRequest将无法正确构造,所以难怪我在请求对象中没有会话。但这只是我的假设。

此外,如果有必要,我会在收到此错误时使用django dev服务器。

编辑13-00

我已经用favicon修复了这个问题,但仍然出现错误。为什么请求中可能不存在会话?

2 个答案:

答案 0 :(得分:19)

问题在于中间件订单。

CommonMiddleware返回HttpResponsePermanentRedirect,以便在请求url时添加'www'或尾随'/'(设置中为APPEND_SLASH和PREPEND_WWW)。在这种情况下,django停止查看process_request方法的中间件列表并开始运行process_response方法。

标准的django中间件没有关于此类行为的信息很糟糕(即中间件在某些情况下可能会返回HttpResponse对象)。

答案 1 :(得分:1)

如果您因为更新到Django 2.0而来到这里并收到此错误,您可能想知道名称MIDDLEWARE_CLASSES已替换为MIDDLEWARE

更多信息https://stackoverflow.com/a/47650447/1218179https://docs.djangoproject.com/en/2.0/topics/http/middleware/