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!

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.


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]

1
To nie pomaga, jeśli klucz sesji nie istnieje.
Greg

19

w Django> = 1.4 użyj:

request.session._session_key

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()


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)

3

W Django 1.8:

request.session.session_key

i

request.session._session_key

Obie działają poprawnie.


-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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.