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

88

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

rmh
источник

Ответы:

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()
Виджей Шенкер
источник
7

Использование:

request.COOKIES['sessionid']
Гарольд
источник
6

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

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

    print(request.session.session_key)
Грег
источник
3

В Django 1.8:

request.session.session_key

а также

request.session._session_key

Оба работают правильно.

Сартак Агравал
источник
-1

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

If "var" in request.session:
       Var = request.session['var']
        Return httpResponse("set")
Else:
       Return httpResponse("there isn't")
Омид Реза
источник