Перед тем как работать с сеансами в 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