Ich versuche AnonymousUsers zu verfolgen, wenn sie zuerst auf die Website kommen, und wenn sie sich dann auf der Website registrieren.Django: Wie man Sitzungs-Cookie für AnonymousUser ohne Verwendung von SESSION_SAVE_EVERY_REQUEST setzt
Dazu habe ich eine Middleware mit der entsprechenden Funktionalität erstellt, aber zunächst ging man davon aus, dass jedem AnonymousUsers bereits eine Sitzung zugeordnet war (SessionID-Cookie wird in erster Reaktion gesetzt & assoziierte Sitzung ist bereits in django_session angelegt) . Hinweis: Sitzung App & Middleware vorhanden ist
Es scheint, dass dies nicht der Fall ist, wie in der Sitzung Middleware suchen, wenn ein AnonymousUser zuerst auf der Seite kommt, wird die Sitzung nie (Benutzer geändert tun, da ' _auth_user_id‘und '_auth_user_backend' gesetzt sind), und so wird erstellt nie:
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
Versuch 1
Um zu versuchen, dies zu überwinden, in meiner Middleware, die unterhalb der Session Middleware platziert ist, würde ich zwingen, a() auf der Sitzung speichern, es zu schaffen:
if hasattr(request, 'session') and not request.session.session_key:
request.session.save()
Dies würde bieten die session_key, aber leider, wenn SessionMiddleware.process_response genannt wird, ist request.session.modified noch gleich falsch, und so wird der Sitzungs-Cookie nicht gesetzt ...
Versuch 2
Eine Möglichkeit, dies zu tun, scheint die Sitzung, in einer beliebigen Art und Weise, zu modifizieren, dass request.session.modified == True
im SessionMiddleware.process_response zu gewährleisten:
if hasattr(request, 'session') and not request.session.session_key:
request.session.save()
request.session['some_variable'] = True
Das scheint mein Problem zu beheben, ohne Rückgriff auf SESSION_SAVE_EVERY_REQUEST
, die zuviel des Guten sein würde, aber noch ist es nicht ganz richtig sein ....
Frage
Wie stellen Sie sicher, dass die Sitzung für einen AnonymousUser ohne vorherigen Besuch erstellt wird, ohne die Sitzung explizit zu ändern oder SESSION_SAVE_EVERY_REQUEST=True
zu haben?
Danke für Ihre Hilfe!
Danke Aidan, das funktioniert super.Ich bin immer noch nicht klar, warum das Sitzungsmodul keine Sitzung erstellen würde, wenn eine nicht vorhanden ist, aber nur, wenn es "geändert" wird ...? – legrisdev
Ja, ich weiß was du meinst. Freut mich, dass du es trotzdem sortiert hast. –