Найти тему
Kangaroo

Подсистема сеансов в Django

Оглавление
Если вы дадите человеку программу, то займете его на один день. Если вы научите человека программировать, то займете его на всю жизнь. Waseem Latif
Если вы дадите человеку программу, то займете его на один день. Если вы научите человека программировать, то займете его на всю жизнь. Waseem Latif

Перед тем как работать с сеансами в Django:

1) Убедитесь, что параметр MIDDLEWARE_CLASSES содержит строку 'django.contrib.sessions.middleware.SessionMiddleware'

2) Убедитесь, что в параметре INSTALLED_APPS присутствует присутствует приложение 'django.contrib.session'

Что не стоит делать:

  • Избегайте использование в качестве ключей словаря request.session целых чисел и объектов;

Помните что ключи, начинающиеся со знака подчеркивания, зарезервированы Django для внутреннего использования:

request.session['_fav_color'] = 'black' # Не делай так!!!
  • Не подменивайте request.session новым объектом, не изменяйте значения его атрибутов и не добавляйте новые атрибуты:
request.session.foo = 'bar' # Не делай так!!!

С точки зрения внутренней реализации каждый сеанс - это обычная модель Django, определение которой находится в модуле django.contrib.session.models. Сеанс идентифицируется случайной строкой из 32 символов. Поскольку сеанс - это обычная модель, то к нему можно обращаться:

from django.contrib.sessions.models import Session
s = Session.objects.get(pk='1g8hh54cvbn09calsbzy541bnk653vba9")
s.expire_date()

Чтобы получить данные, хранящиеся в сеансе, нужно вызывать метод get_decoded(). Это необходимо так как данные хранятся в зашифрованном виде:

s.get_decoded()

По умолчанию Django сохраняет сеанс в базе данных только при его модификации, чтобы изменить такое поведение, присвойте параметру SESSION_SAVE_EVERY_REQUEST значение TRUE. В этом случае Django будет сохранять сеанс в базе данных при каждом запросе, даже если сеанс не изменился.

Срок хранения cookie в Django определяется параметром SESSION_EXPIRE_AT_BROWSER_CLOSE, по умолчанию равным FALSE, то есть cookie будут храниться в браузере пользователя в течении SESSION_COOKIE_AGE, который по умолчанию равен 1 209 600 секунд, то есть две недели.

Если в параметре SESSION_EXPIRE_AT_BROWSER_CLOSE установить значение True, то Django будет посылать временные cookies, хранящиеся, только пока браузер открыт.

В заключении отмечу:

  • Словарь сеанса допускает сохранять любой объект, который может быть сериализован с помощью модуля pickle;
  • Данные сеансов хранятся в таблице базы данных django_session;
  • По умолчанию Django посылает cookie, только когда это необходимо;
  • Вся подсистема сеансов Django основана на cookies