W Django, jak mogę znaleźć identyfikator sesji request.session i użyć go jako zmiennej?

88

Zdaję sobie sprawę, że możesz uzyskać zmienne sesji za pomocą request.session['variable_name'], ale wydaje się, że nie ma sposobu na pobranie identyfikatora sesji jako zmiennej w podobny sposób. Czy jest to gdzieś udokumentowane? Nie mogę tego znaleźć. Dzięki za pomoc!

rmh
źródło

Odpowiedzi:

142

O wiele prostsze:

request.session.session_key

Pamiętaj, że klucz będzie istniał tylko wtedy, gdy istnieje sesja, brak klucza, brak sesji. Możesz użyć tego do sprawdzenia, czy sesja istnieje. Jeśli chcesz utworzyć sesję, zadzwoń do create.

dalore
źródło
3
@VebjornLjosa co robi?
aehlke
3
@aehike: request.session._session_keyzgodnie z odpowiedzią @Vinicius
hughes
3
request.session.session_keydziała dobrze w Django 1.6.
ecstaticpeon
9
request.session.session_keydziała również dobrze w Django 1.7.
Andrew E,
3
Wolę używać, request.session._get_or_create_session_key()ponieważ może się zdarzyć, że po prostu nie ma jeszcze identyfikatora.
patroqueeet
24

Sesje Django zapisują swój klucz w pliku cookie. Przynajmniej jego oprogramowanie pośredniczące wyodrębnia go w ten sposób:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
che
źródło
1
To nie pomaga, jeśli klucz sesji nie istnieje.
Greg
19

w Django> = 1.4 użyj:

request.session._session_key
Winicjusz
źródło
9
Erm, główną intencją zmiennych prywatnych (jedynek zaczynające się od znaku podkreślenia) jest to, że należy nie z nich korzystać.
Michał Górny
1
@ MichałGórny więc jaka jest alternatywa? jeśli nie ma, nie widzę, jaki mamy wybór ...
Mark
1
Alternatywą jest napisanie odpowiedniego kodu. Jeśli django nie zapewnia publicznego API do uzyskania klucza sesji, oznacza to po prostu, że nie powinieneś używać tego klucza. Nie mogę powiedzieć więcej, nie wiedząc, co dokładnie chcesz zrobić, ale prawdopodobnie jest to pole do oddzielnego pytania.
Michał Górny
12

W ten sposób otrzymasz identyfikator sesji lub utworzysz go dla Ciebie. Jeśli to zrobisz dir(request.session), otrzymasz wiele przydatnych metod.

['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
źródło
7

Posługiwać się:

request.COOKIES['sessionid']
Harold
źródło
6

Aby niezawodnie uzyskać klucz sesji, musisz najpierw upewnić się, że sesja została utworzona. Dokumentacja wspomina o .create()metodzie sesji, której można użyć, aby upewnić się, że istnieje klucz sesji:

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

    print(request.session.session_key)
Greg
źródło
3

W Django 1.8:

request.session.session_key

i

request.session._session_key

Obie działają poprawnie.

Sarthak Agrawal
źródło
-1

Możesz również sprawdzić swoje sesje :

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Omid reza
źródło