Wie kann ich in Django die Sitzungs-ID request.session ermitteln und als Variable verwenden?

85

Ich bin mir bewusst, dass Sie Sitzungsvariablen mit verwenden können request.session['variable_name'], aber es scheint keine Möglichkeit zu geben, die Sitzungs-ID auf ähnliche Weise als Variable abzurufen. Ist das irgendwo dokumentiert? Ich kann es nicht finden Danke für Ihre Hilfe!

rmh
quelle

Antworten:

138

Viel einfacher:

request.session.session_key

Beachten Sie, dass der Schlüssel nur vorhanden ist, wenn eine Sitzung vorhanden ist, kein Schlüssel, keine Sitzung. Sie können dies verwenden, um zu testen, ob eine Sitzung vorhanden ist. Wenn Sie eine Sitzung erstellen möchten, rufen Sie create auf.

dalore
quelle
3
@VebjornLjosa was macht?
Aehlke
3
@aehike: request.session._session_keygemäß der Antwort von @Vinicius
Hughes
3
request.session.session_keyfunktioniert gut in Django 1.6.
Ecstaticpeon
9
request.session.session_keyfunktioniert auch gut in Django 1.7.
Andrew E
3
Ich bevorzuge die Verwendung, request.session._get_or_create_session_key()da es vorkommen kann, dass noch keine ID vorhanden ist.
Patroqueeet
24

Django-Sitzungen speichern ihren Schlüssel in einem Cookie. Zumindest seine Middleware extrahiert es so:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
che
quelle
1
Dies hilft jedoch nicht, wenn der Sitzungsschlüssel nicht vorhanden ist.
Greg
19

in Django> = 1.4 benutze:

request.session._session_key
Vinicius
quelle
9
Ähm, die Hauptabsicht privater Variablen (solche, die mit einem Unterstrich beginnen) ist, dass Sie sie nicht verwenden sollten.
Michał Górny
1
@ MichałGórny also was ist die Alternative? Wenn es keine gibt, sehe ich nicht, wie wir eine Wahl haben ...
Mark
1
Die Alternative besteht darin, den richtigen Code zu schreiben. Wenn django keine öffentliche API zum Abrufen des Sitzungsschlüssels bereitstellt , bedeutet dies einfach, dass Sie diesen Schlüssel nicht verwenden sollten. Ich kann Ihnen nicht mehr sagen, ohne genau zu wissen, was Sie versuchen, aber dann ist es wahrscheinlich ein Feld für separate Fragen.
Michał Górny
12

Dadurch erhalten Sie entweder eine Sitzungs-ID oder erstellen eine für Sie. Wenn Sie dies tun dir(request.session), erhalten Sie viele nützliche Methoden.

['TEST_COOKIE_NAME', 'TEST_COOKIE_VALUE', '__class__', '__contains__',
'__delattr__', '__delitem__', '__dict__', '__doc__', '__format__',
'__getattribute__', '__getitem__', '__hash__', '__init__', '__module__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'_get_new_session_key', '_get_or_create_session_key', '_get_session',
'_get_session_key', '_hash', '_session', '_session_key', 'accessed',
'clear', 'create', 'cycle_key', 'decode', 'delete', 'delete_test_cookie',
'encode', 'exists', 'flush', 'get', 'get_expire_at_browser_close',
'get_expiry_age', 'get_expiry_date', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keys', 'load', 'modified', 'pop', 'save',
'session_key', 'set_expiry', 'set_test_cookie', 'setdefault',
'test_cookie_worked', 'update', 'values']


session_id = request.session._get_or_create_session_key()
Vijay Shanker
quelle
6

Verwenden:

request.COOKIES['sessionid']
Harold
quelle
6

Um den Sitzungsschlüssel zuverlässig abzurufen, müssen Sie sicherstellen, dass die Sitzung zuerst erstellt wurde. In der Dokumentation wird eine .create()Sitzungsmethode erwähnt , mit der sichergestellt werden kann, dass ein Sitzungsschlüssel vorhanden ist:

def my_view(request):
    if not request.session.session_key:
        request.session.create()

    print(request.session.session_key)
Greg
quelle
3

In Django 1.8:

request.session.session_key

und

request.session._session_key

Beide funktionieren korrekt.

Sarthak Agrawal
quelle
-1

Sie können auch Ihre Sitzungen einchecken :

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Omid reza
quelle