No Django, como posso descobrir o sessionid request.session e usá-lo como uma variável?

88

Estou ciente de que você pode obter variáveis ​​de sessão usando request.session['variable_name'], mas não parece haver uma maneira de capturar a id de sessão como uma variável de maneira semelhante. Isso está documentado em algum lugar? Eu não consigo encontrar. Obrigado pela ajuda!

rmh
fonte

Respostas:

142

Muito mais simples:

request.session.session_key

Observe que a chave só existirá se houver uma sessão, sem chave, sem sessão. Você pode usar isso para testar se existe uma sessão. Se você quiser criar uma sessão, ligue para criar.

Dalore
fonte
3
@VebjornLjosa o que faz?
aehlke de
3
@aehike: de request.session._session_keyacordo com a resposta de @Vinicius
hughes de
3
request.session.session_keyfunciona bem no Django 1.6.
ecstaticpeon
9
request.session.session_keytambém funciona bem no Django 1.7.
Andrew E
3
Prefiro usar request.session._get_or_create_session_key()porque, pode acontecer que ainda não haja um ID.
patroqueeet de
24

As sessões do Django salvam sua chave em um cookie. Pelo menos seu middleware o extrai assim:

from django.conf import settings
session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
che
fonte
1
Isso não ajuda se a chave de sessão não existir.
Greg
19

no Django> = 1.4 use:

request.session._session_key
Vinicius
fonte
9
Erm, o objetivo principal das variáveis ​​privadas (aquelas que começam com um sublinhado) é que você não deve usá-las.
Michał Górny
1
@ MichałGórny então qual é a alternativa? se não houver nenhum, não vejo como temos escolha ...
Marcos
1
A alternativa é escrever o código adequado. Se o django não fornecer uma API pública para obter a chave de sessão, significa simplesmente que você não deve usar essa chave. Não posso dizer mais nada sem saber o que exatamente você está tentando fazer, mas provavelmente é um campo para perguntas separadas.
Michał Górny
12

Isso lhe dará um ID de sessão ou criará um para você. Se o fizer dir(request.session), obterá muitos métodos úteis.

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

Usar:

request.COOKIES['sessionid']
Harold
fonte
6

Para obter a chave de sessão de forma confiável, você precisa ter certeza de que a sessão foi criada primeiro. A documentação menciona um .create()método de sessão, que pode ser usado para garantir que haja uma chave de sessão:

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

    print(request.session.session_key)
Greg
fonte
3

No Django 1.8:

request.session.session_key

e

request.session._session_key

Ambos funcionam corretamente.

Sarthak Agrawal
fonte
-1

Você também pode verificar suas sessões :

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