如果用户已登录,我想设置一个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
。
问题:
答案 0 :(得分:25)
最近遇到同样的问题,发现它是在没有尾部斜杠的情况下访问网址时发生的,并且APPEND_SLASH设置设置为true:
Django处理初始请求
然后Django使用尾部斜杠处理url请求
任何人都知道为什么在永久重定向后,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
)
yourdomain.com/view
。这启动了中间件流程。CommonMiddleware
后,中间件会看到没有斜杠并返回http.HttpResponsePermanentRedirect(newurl)
。这会立即停止运行任何其他process_requests
,包括将AuthenticationMiddleware
属性添加到user
request
中的一个CommonMiddleware
Http404
未返回异常(包括django
),process_response()
现在将从中间件获取响应,并在列出的每个中间件中通过每个MIDDLEWARE_CLASSES
运行它在process_request()
中,无论该中间件的process_request()
是否有机会运行。解决此问题的唯一真正方法是将代码移至位于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,您将收到问题标题中提到的错误。