Как в Django узнать идентификатор сеанса request.session и использовать его в качестве переменной?


88

Я знаю, что вы можете использовать переменные сеанса request.session['variable_name'], но, похоже, нет способа получить идентификатор сеанса в качестве переменной аналогичным образом. Это где-нибудь задокументировано? Я не могу его найти. Спасибо за вашу помощь!

Ответы:


142

Гораздо проще:

request.session.session_key

Обратите внимание, что ключ будет существовать только при наличии сеанса, без ключа, без сеанса. Вы можете использовать это, чтобы проверить, существует ли сеанс. Если вы хотите создать сеанс, вызовите create.


3
@VebjornLjosa что делает?
aehlke

3
@aehike: request.session._session_keyсогласно ответу @Vinicius
hughes

3
request.session.session_keyотлично работает в Django 1.6.
ecstaticpeon

9
request.session.session_keyтакже отлично работает в Django 1.7.
Эндрю Э

3
Я предпочитаю использовать, request.session._get_or_create_session_key()потому что может случиться так, что еще нет идентификатора.
patroqueeet

24

Сессии Django сохраняют свой ключ в куки. По крайней мере, его промежуточное ПО извлекает это так:

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

1
Это не поможет, если сеансовый ключ не существует.
Грег

19

в Django> = 1.4 используйте:

request.session._session_key

9
Эээ, основная цель приватных переменных (начинающихся с подчеркивания) заключается в том, что вы не должны их использовать.
Michał Górny

1
@ MichałGórny, а какая альтернатива? если его нет, я не понимаю, как у нас есть выбор ...
Марк

1
Альтернатива - написать правильный код. Если django не предоставляет общедоступный API для получения сеансового ключа, это просто означает, что вы не должны использовать этот ключ. Я не могу рассказать вам больше, не зная, что именно вы пытаетесь сделать, но тогда, вероятно, это поле для отдельного вопроса.
Michał Górny

12

Это либо даст вам идентификатор сеанса, либо создаст его для вас. Если вы это сделаете dir(request.session), вы получите много полезных методов.

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

Чтобы надежно получить ключ сеанса, вам необходимо сначала убедиться, что сеанс был создан. В документации упоминается .create()метод сеанса, который можно использовать для проверки наличия сеансового ключа:

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

    print(request.session.session_key)


-1

Вы также можете проверить свои сеансы :

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.