In Django, come posso trovare il sessionid request.session e usarlo come variabile?


89

Sono consapevole del fatto che puoi ottenere variabili di sessione usando request.session['variable_name'], ma non sembra esserci un modo per afferrare il sessionid come variabile in un modo simile. È documentato da qualche parte? Non riesco a trovarlo. Grazie per l'aiuto!

Risposte:


145

Molto più semplice:

request.session.session_key

Nota che la chiave esisterà solo se c'è una sessione, nessuna chiave, nessuna sessione. Puoi usarlo per verificare se esiste una sessione. Se vuoi creare una sessione, chiama create.


3
@aehike: request.session._session_keycome da risposta di @Vinicius
hughes

3
request.session.session_keyfunziona bene in Django 1.6.
ecstaticpeon

9
request.session.session_keyfunziona bene anche in Django 1.7.
Andrew E

3
Preferisco usare request.session._get_or_create_session_key()perché, può succedere che non ci sia ancora un ID.
patroqueeet

2
Se questo funziona o meno dipende interamente dal fatto che la sessione sia stata creata. Vedi la mia risposta
Greg

25

Le sessioni Django salvano la loro chiave in un cookie. Almeno il suo middleware lo estrae in questo modo:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]

1
Questo però non aiuta se la chiave di sessione non esiste.
Greg

19

in Django> = 1.4 utilizzare:

request.session._session_key

9
Ehm, l'intento principale di variabili private (quelli che iniziano con un carattere di sottolineatura) è che si dovrebbe non usarli.
Michał Górny

1
@ MichałGórny quindi qual è l'alternativa? se non ce n'è, non vedo come abbiamo una scelta ...
Marco

1
L'alternativa è scrivere il codice corretto. Se django non fornisce un'API pubblica per ottenere la chiave di sessione, significa semplicemente che non dovresti usare quella chiave. Non posso dirti di più senza sapere esattamente cosa stai cercando di fare, ma probabilmente è un campo per domande separate.
Michał Górny

12

Questo ti darà un ID di sessione o ne creerà uno per te. Se lo fai dir(request.session), otterrai molti metodi utili.

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

8

Per ottenere in modo affidabile la chiave di sessione, è necessario assicurarsi che la sessione sia stata creata prima. La documentazione menziona un .create()metodo di sessione, che può essere utilizzato per assicurarsi che ci sia una chiave di sessione:

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

    print(request.session.session_key)


3

In Django 1.8:

request.session.session_key

e

request.session._session_key

Entrambi funzionano correttamente.


-1

Puoi anche controllare le tue sessioni :

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.