Django:WSGIRequest'对象在某些页面上没有属性'user'?

时间:2012-06-27 09:56:31

标签: python django wsgi django-middleware

如果用户已登录,我想设置一个cookie。

我的中间件:

class UserStatus(object):
    def process_response(self,request,response):
        user_status = 1 if request.user.is_authenticated() else 0
        max_age = (20)*52*7*24*60*60 # 20 years (After expiry, cookie gets deleted)
        response.set_cookie(user_status_cookie,user_status,max_age)
        return response

在最后的settings.py中添加到MIDDLEWARE_CLASSES

问题:

  • 错误:'WSGIRequest'对象没有属性'user'
  • 为什么,当我已经启用身份验证和会话中间件时?
  • 此外,有些页面正在顺利运行,因为有些页面会出现此错误。
  • 我做错了什么?

6 个答案:

答案 0 :(得分:25)

最近遇到同样的问题,发现它是在没有尾部斜杠的情况下访问网址时发生的,并且APPEND_SLASH设置设置为true:


Django处理初始请求

  • CommonMiddleware.process_request
    • 重定向到newurl,其中包含尾部斜杠
  • process_response仍在自定义中间件中运行
    • request.user不存在
  • HTTP 301

然后Django使用尾部斜杠处理url请求

  • process_response在自定义中间件中运行
    • request.user现在存在

任何人都知道为什么在永久重定向后,process_response中无法访问某些主要属性(用户和会话)?

答案 1 :(得分:16)

因此,它与通过Django Common Middleware的重定向应用APPEND_SLASH有关,阻止了process_request()中的AuthenticationMiddleware(添加了user属性)正在运行但process_response仍在运行。

以下是Django Process Middleware的实际工作方式(来自Django 1.6中的django/core/handlers/base.py

  1. 您请求的网址没有尾部斜杠。所以yourdomain.com/view。这启动了中间件流程。
  2. 请求到达CommonMiddleware后,中间件会看到没有斜杠并返回http.HttpResponsePermanentRedirect(newurl)。这会立即停止运行任何其他process_requests,包括将AuthenticationMiddleware属性添加到user
  3. request中的一个CommonMiddleware
  4. 由于Http404未返回异常(包括django),process_response()现在将从中间件获取响应,并在列出的每个中间件中通过每个MIDDLEWARE_CLASSES运行它在process_request()中,无论该中间件的process_request()是否有机会运行。
  5. 解决此问题的唯一真正方法是将代码移至位于AuthenticationMiddleware MIDDLEWARE_CLASSES之后的hasattr()方法,或通过request检测user对象具有{{1}}属性。

答案 2 :(得分:12)

根据FineManual:

  

在响应阶段(process_response()和process_exception()中间件),类从底部向上以相反的顺序应用

所以我说你最好在 auth和会话中间件之前添加你的中间件(假设它只处理响应)。

话虽如此,我对某些页面上只有错误这一事实感到有些疑惑???

答案 3 :(得分:9)

你有活跃的中间件吗?:

'django.contrib.auth.middleware.AuthenticationMiddleware'

这个中间件是在你的中间件之前运行的吗?

答案 4 :(得分:4)

我有类似的问题,我的一些页面在请求中没有用户,所以在我的中间件中我做了快速检查

if not hasattr(request, 'user'):
    return response

答案 5 :(得分:0)

在django的AuthenticationMiddleware(负责将.user分配给请求对象)之前运行的某些中间件或任何其他代码中可能会出现异常。

然后在访问.user变量时会出现AttributeError。

例如,在AuthenticationMiddleware有机会运行之前触发的任何异常都可能导致错误视图执行。如果错误视图取决于request.user,您将收到问题标题中提到的错误。