I want to set a cookie if user is logged in or not.
My middleware:
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
Added to MIDDLEWARE_CLASSES
in settings.py at the end.
Problem:
Ran into the same issue recently, and found that it happened when a url is being accessed without the trailing slash, and the APPEND_SLASH setting is set to true:
Django processes initial request
Django then processes the request of url with trailing slash
Anyone knows why some of the main attributes (user and session) are not accessible in process_response after a permanent redirect?
So it has to do with APPEND_SLASH
being applied with via a redirect by Django Common Middleware, preventing the process_request()
in AuthenticationMiddleware
(which adds the user
attribute) from being run but your process_response
still being run.
Here's how Django Process Middleware ACTUALLY Works (from django/core/handlers/base.py
in Django 1.6)
yourdomain.com/view
. This starts the middleware flow.CommonMiddleware
, the middleware sees that there is not a slash and returns a http.HttpResponsePermanentRedirect(newurl)
. This immediately stops any additional process_requests
from being run, including one in AuthenticationMiddleware
that add the user
attribute to request
CommonMiddleware
did not return an exception (including Http404
), django
will now take the response from the middleware and run it through EVERY process_response()
in EVERY middleware listed in MIDDLEWARE_CLASSES
, no matter if that middleware's process_request()
had a chance to run.The only real way to fix this is to either move your code into a process_request()
method located after AuthenticationMiddleware
in MIDDLEWARE_CLASSES
or detect via hasattr()
if the request
object has a user
attribute.
According to the FineManual:
During the response phases (process_response() and process_exception() middleware), the classes are applied in reverse order, from the bottom up
So I'd say you'd better add your middleware before the auth and session middlewares (assuming it only processes the response).
This being said, I'm a bit puzzled by the fact that you only have the error on some pages ???
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With