【问题标题】:'WSGIRequest' object has no attribute 'session''WSGIRequest' 对象没有属性 'session'
【发布时间】:2012-07-31 18:36:08
【问题描述】:

我有时在 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

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

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

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

如果有必要,我在收到此错误时正在使用 django 开发服务器。

编辑 13-00

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

【问题讨论】:

  • 那么问题出在哪里?如果您收到错误,您可以将日志添加到此问题中吗?
  • 哦,在标题中:'WSGIRequest'对象没有属性'session'。每次我试图获取我网站的任何 url 时都会发生。它发生在 application.middleware.LastCampaignSessionMiddleware 的 process_response 方法中。

标签: django django-middleware


【解决方案1】:

问题出在中间件顺序上。

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

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

【讨论】:

  • 谢谢 - 很好的解释,这正是发生在我身上的事情以及原因。除了将 SessionMiddleware 放在首位之外,您还可以通过以下方式进行保护:if hasattr(request, 'session')
【解决方案2】:

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

更多这里https://stackoverflow.com/a/47650447/1218179和这里https://docs.djangoproject.com/en/2.0/topics/http/middleware/

【讨论】:

  • 非常感谢!我没有看到,并且遇到了同样的麻烦......
猜你喜欢
  • 1970-01-01
  • 2016-07-30
  • 2017-02-02
  • 2015-04-15
  • 2013-05-20
  • 2016-09-22
  • 2015-10-19
  • 2021-11-16
  • 2021-12-26
相关资源
最近更新 更多