2012-08-02 87 views
13

我在process_response方法中有时会在自定义中间件中遇到此错误。我有中间件的下面的列表:'WSGIRequest'对象没有属性'会话'

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 

不知道为什么它会发生在所有。

编辑2012年3月8日12-30

它看起来像浏览器请求图标:

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

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

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

EDIT 13-00

我已经解决了这个问题,但图标仍然得到错误。为什么会话可能不存在请求?

+0

那么问题是什么?如果您遇到错误,可以将日志添加到此问题中? – StefanNch 2012-08-03 09:42:15

+0

哦,它是在标题中:'WSGIRequest'对象没有属性'会话'。每次尝试获取我网站的任何网址时发生。它发生在application.middleware.LastCampaignSessionMiddleware的process_response方法中。 – sunprophit 2012-08-03 09:44:19

回答

19

问题出在中间件的顺序。

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

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

+2

谢谢 - 非常好的解释,这正是我和为什么发生的事情。而不是首先放置SessionMiddleware,你也可以通过以下方式来防范:'如果hasattr(request,'session')' – dkamins 2012-12-30 01:54:07

相关问题