Я пытаюсь отслеживать AnonymousUsers, чтобы выяснить, когда они впервые приходят на сайт, и когда они затем регистрируются на сайте.Django: Как установить sessionid cookie для AnonymousUser без использования SESSION_SAVE_EVERY_REQUEST
Для этого я создал промежуточное программное обеспечение с соответствующей функциональностью, но изначально предполагалось, что у каждого из них есть связанный с ним сеанс (например, sessionid cookie будет установлен в первом ответе & связанный сеанс уже создан в django_session) , Примечание: сессия приложение & промежуточного слоя присутствуют
кажется, что это не так, поскольку, глядя на сессии промежуточного слоя, когда AnonymousUser первый приходит на сайт, сеанс не изменяли (пользователи делают, так как " _auth_user_id»и '_auth_user_backend' установлены), и поэтому никогда не создается:
SessionMiddleware.process_response
def process_response(self, request, response):
"""
If request.session was modified, or if the configuration is to save the
session every time, save the changes and set a session cookie.
"""
try:
accessed = request.session.accessed
modified = request.session.modified
except AttributeError:
pass
else:
if accessed:
patch_vary_headers(response, ('Cookie',))
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
if request.session.get_expire_at_browser_close():
max_age = None
expires = None
else:
max_age = request.session.get_expiry_age()
expires_time = time.time() + max_age
expires = cookie_date(expires_time)
# Save the session data and refresh the client cookie.
request.session.save()
response.set_cookie(settings.SESSION_COOKIE_NAME,
request.session.session_key, max_age=max_age,
expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
path=settings.SESSION_COOKIE_PATH,
secure=settings.SESSION_COOKIE_SECURE or None,
httponly=settings.SESSION_COOKIE_HTTPONLY or None)
return response
Покушение 1
Чтобы попытаться преодолеть это, в моем Middleware, который расположен ниже Session Middleware, я бы заставить ворота() на сессии для его создания:
if hasattr(request, 'session') and not request.session.session_key:
request.session.save()
Это будет обеспечить session_key, но, к сожалению, когда SessionMiddleware.process_response называется, request.session.modified по-прежнему равна false, и поэтому SessionID печенье не установлен ...
Покушение 2
Один из способов сделать это, кажется, изменить сессию, произвольным образом, чтобы гарантировать, что request.session.modified == True
в SessionMiddleware.process_response:
if hasattr(request, 'session') and not request.session.session_key:
request.session.save()
request.session['some_variable'] = True
Это, кажется, чтобы исправить мою проблему, без прибегая к SESSION_SAVE_EVERY_REQUEST
, что было бы излишним, но пока это не кажется совершенно правы ....
Вопрос
Как убедиться, что сеанс создан для анонимного пользователя без предыдущего посещения, без явной модификации сеанса или с SESSION_SAVE_EVERY_REQUEST=True
?
Спасибо за помощь!
Спасибо Aidan, что отлично работает.Я все еще не понимаю, почему сеансовый модуль не создавал сеанс, если он отсутствует, но только когда он «изменен» ...? – legrisdev
Да, я знаю, что вы имеете в виду. Рад, что вы все разобрались. –