Как использовать сессии
Django полностью поддерживает анонимные сессии. Фреймворк сессий позволяет хранить и извлекать произвольные данные для каждого посетителя сайта. Данные хранятся на стороне сервера, а отправка и получение куки-файлов абстрагированы. Куки-файлы содержат идентификатор сессии, а не сами данные (если вы не используете хранилище сессий на основе куки).
Включение сессий
Сессии реализуются с помощью модуля middleware.
Для включения функциональности сессий выполните следующие действия:
- Отредактируйте настройку
MIDDLEWAREи убедитесь, что она содержит'django.contrib.sessions.middleware.SessionMiddleware'. По умолчаниюsettings.pyсозданнаяdjango-admin startprojectимеетSessionMiddlewareвключёнными.
Если вы не хотите использовать сессии, можете удалить строку SessionMiddleware из MIDDLEWARE и 'django.contrib.sessions' из INSTALLED_APPS. Это сэкономит немного ресурсов.
Настройка движка сессий
По умолчанию Django хранит сессии в базе данных (используя модель django.contrib.sessions.models.Session). Хотя это удобно, в некоторых случаях быстрее хранить данные сессии в другом месте, поэтому Django можно настроить на хранение данных сессий на файловой системе или в кэше.
Использование сессий, поддерживаемых базой данных
Если вы хотите использовать сессии, поддерживаемые базой данных, необходимо добавить 'django.contrib.sessions' в настройку INSTALLED_APPS.
После настройки вашей установки запустите manage.py migrate для создания единственной таблицы базы данных, которая хранит данные сессии.
Использование кэшированных сессий
Для повышения производительности вы можете использовать хранилище сессий на основе кэша.
Чтобы хранить данные сессий с помощью системы кэширования Django, сначала необходимо настроить свой кэш; см. документацию по кэшированию для получения подробной информации.
Предупреждение
Вы должны использовать сессии на основе кэша только в том случае, если используете хранилище кэша Memcached. Хранилище кэша локальной памяти не сохраняет данные достаточно долго, чтобы быть хорошим выбором, и будет быстрее использовать непосредственно файловые или базовые сессии, вместо того, чтобы отправлять всё через файловые или базовые хранилища кэша. Кроме того, хранилище кэша локальной памяти НЕ безопасно для нескольких процессов, поэтому, вероятно, не является хорошим выбором для производственных сред.
Если в CACHES определено несколько кэшей, Django будет использовать кэш по умолчанию. Чтобы использовать другой кэш, установите SESSION_CACHE_ALIAS на имя этого кэша.
После настройки кэша у вас есть два варианта хранения данных в кэше:
- Установите
SESSION_ENGINEна"django.contrib.sessions.backends.cache"для простого хранилища кэшированных сессий. Данные сессий будут храниться непосредственно в вашем кэше. Однако данные сессии могут не сохраняться: данные кэша могут быть удалены, если кэш заполнится или если сервер кэша перезапустится. - Для сохранения данных кэша, установите
SESSION_ENGINEна"django.contrib.sessions.backends.cached_db". Это использует кэш с прохождением записи — каждая запись в кэш также будет записываться в базу данных. Чтение сессий использует только базу данных, если данные уже не находятся в кэше.
Оба хранилища сессий достаточно быстры, но простое хранилище кэша быстрее, поскольку оно игнорирует сохранение. В большинстве случаев хранилище cached_db будет достаточно быстрым, но если вам нужна максимальная производительность и вы готовы время от времени удалять данные сессии, хранилище cache для вас.
Если вы используете хранилище сессий cached_db, вам также необходимо следовать инструкциям по настройке для использования сессий, поддерживаемых базой данных.
Использование файловых сессий
Чтобы использовать файловые сессии, установите настройку SESSION_ENGINE на "django.contrib.sessions.backends.file".
Также вы можете установить настройку SESSION_FILE_PATH (по умолчанию значение берется из tempfile.gettempdir(), скорее всего /tmp), чтобы управлять тем, где Django хранит файлы сессий. Убедитесь, что ваш веб-сервер имеет разрешения на чтение и запись в этом месте.
Использование сессий на основе куки
Примечание
Рекомендуется оставить настройку SESSION_COOKIE_HTTPONLY в значении True, чтобы предотвратить доступ к сохранённым данным из JavaScript.
Предупреждение
Если ключ SECRET_KEY не является секретным и вы используете PickleSerializer, это может привести к удалённому выполнению произвольного кода.
Злоумышленник, имеющий доступ к SECRET_KEY, может не только генерировать поддельные данные сессии, которым доверяет ваш сайт, но и удалённо выполнять произвольный код, поскольку данные сериализуются с помощью pickle.
Если вы используете сессии на основе куки, обратите особое внимание на то, чтобы ваш секретный ключ всегда хранился в секрете, для любой системы, которая может быть удалённо доступна.
Данные сессии подписываются, но не шифруются
При использовании хранилища куки клиент может прочитать данные сессии.
Для защиты данных от изменений со стороны клиента используется MAC (код аутентификации сообщения), поэтому данные сессии будут недействительными при попытке их изменения. Такое же аннулирование происходит, если клиент, хранящий куки (например, браузер вашего пользователя), не может сохранить весь куки сессии и теряет данные. Несмотря на то, что Django сжимает данные, вполне возможно превысить обычное ограничение в 4096 байт на куки.
Гарантия свежести отсутствует
Обратите также внимание, что, хотя MAC может гарантировать подлинность данных (что они были сгенерированы вашим сайтом, а не кем-то другим) и целостность данных (что они все там и правильные), он не может гарантировать свежесть, т.е. что вам возвращается последняя отправленная клиенту информация. Это означает, что при некоторых способах использования данных сессии хранилище куки может открыть вас для атак повторения. В отличие от других хранилищ сессий, которые сохраняют запись на сервере для каждой сессии и аннулируют её при выходе пользователя, сессии на основе куки не аннулируются при выходе пользователя. Таким образом, если злоумышленник украдёт куки пользователя, он может войти как этот пользователь, даже если пользователь вышел. Куки будут считаться «просроченными» только если они старше вашего SESSION_COOKIE_AGE.
Производительность
Наконец, размер куки может повлиять на скорость вашего сайта.
Использование сессий в представлениях
Когда SessionMiddleware активировано, каждый объект HttpRequest — первый аргумент любой функции представления Django — будет иметь атрибут session, который представляет собой объект типа словарь.
Вы можете читать и записывать в request.session в любой момент в вашем представлении. Вы можете редактировать его несколько раз.
-
class backends.base.SessionBase -
Это базовый класс для всех объектов сессии. Он имеет следующие стандартные методы словаря:
-
__getitem__(key) -
Пример:
fav_color = request.session['fav_color']
-
__setitem__(key, value) -
Пример:
request.session['fav_color'] = 'blue'
-
__delitem__(key) -
Пример:
del request.session['fav_color']. Это вызываетKeyErrorесли указанныйkeyещё не находится в сессии.
-
__contains__(key) -
Пример:
'fav_color' in request.session
-
get(key, default=None) -
Пример:
fav_color = request.session.get('fav_color', 'red')
-
pop(key, default=__not_given) -
Пример:
fav_color = request.session.pop('fav_color', 'blue')
-
keys()
-
items()
-
setdefault()
-
clear()
Также у него есть эти методы:
-
flush() -
Удаляет текущие данные сессии из сессии и удаляет cookie сессии. Это используется, если вы хотите гарантировать, что к предыдущим данным сессии больше нельзя получить доступ из браузера пользователя (например, функция
django.contrib.auth.logout()вызывает её).
-
Устанавливает тестовое cookie для определения, поддерживает ли браузер пользователя cookie. Из-за того, как работают cookie, вы сможете протестировать это только при следующем запросе страницы пользователя. Дополнительную информацию см. в разделе «Установка тестовых cookie» ниже.
-
Возвращает либо
TrueилиFalse, в зависимости от того, принял ли браузер пользователя тестовое cookie. Из-за того, как работают cookie, вам нужно будет вызватьset_test_cookie()в предыдущем отдельном запросе страницы. Дополнительную информацию см. в разделе «Установка тестовых cookie» ниже.
-
Удаляет тестовое cookie. Используйте это, чтобы очистить за собой.
-
set_expiry(value) -
Устанавливает время истечения срока действия сессии. Вы можете передать различные значения:
- Если
valueявляется целым числом, сессия истечёт через указанное количество секунд бездействия. Например, вызовrequest.session.set_expiry(300)приведет к истечению сессии через 5 минут. - Если
valueявляется объектомdatetimeилиtimedelta, сессия истечёт в указанную дату/время. Обратите внимание, что значенияdatetimeиtimedeltaсериализуются только при использованииPickleSerializer. - Если
valueравно0, cookie сессии пользователя истечёт при закрытии веб-браузера пользователя. - Если
valueравноNone, сессия вернётся к использованию глобальной политики истечения срока действия сессии.
Чтение сессии не считается активностью для целей истечения срока действия. Истечение срока действия сессии вычисляется на основе последнего времени изменения сессии.
- Если
-
get_expiry_age() -
Возвращает количество секунд до истечения срока действия этой сессии. Для сессий без пользовательской настройки срока действия (или тех, которые должны истекать при закрытии браузера), это будет равно
SESSION_COOKIE_AGE.Эта функция принимает два необязательных ключевых аргумента:
-
modification: последнее изменение сессии в виде объектаdatetime. По умолчанию — текущее время. -
expiry: информация об истечении срока действия сессии в виде объектаdatetime, целого числа (в секундах) илиNone. По умолчанию — значение, сохранённое в сессии функциейset_expiry(), если оно есть, илиNone.
-
-
get_expiry_date() -
Возвращает дату истечения срока действия этой сессии. Для сессий без пользовательской настройки срока действия (или тех, которые должны истекать при закрытии браузера), это будет дата через
SESSION_COOKIE_AGEсекунд от текущей.Эта функция принимает те же ключевые аргументы, что и
get_expiry_age().
-
get_expire_at_browser_close() -
Возвращает либо
TrueилиFalse, в зависимости от того, истечёт ли cookie сессии пользователя при закрытии веб-браузера пользователя.
-
clear_expired() -
Удаляет истекшие сессии из хранилища сессий. Этот метод класса вызывается
clearsessions.
-
cycle_key() -
Создаёт новый ключ сессии, сохраняя при этом текущие данные сессии.
django.contrib.auth.login()вызывает этот метод, чтобы смягчить проблему фиксации сессий.
-
Сериализация сессий
По умолчанию Django сериализует данные сессии с помощью JSON. Вы можете настроить формат сериализации сессии, используя параметр SESSION_SERIALIZER. Даже с оговорками, описанными в Написание собственного сериализатора, мы настоятельно рекомендуем придерживаться сериализации JSON, особенно если вы используете хранилище cookie.
Например, вот сценарий атаки, если вы используете pickle для сериализации данных сессии. Если вы используете хранилище сессии с подписью cookie и SECRET_KEY известен атакующему (нет внутренней уязвимости в Django, которая бы привела к утечке), атакующий может вставить строку в свою сессию, которая при распаковке выполнит произвольный код на сервере. Техника для этого проста и легко доступна в интернете. Хотя хранилище сессии с cookie подписывает данные, сохранённые в cookie, для предотвращения подделки, утечка SECRET_KEY сразу же приводит к уязвимости удалённого выполнения кода.
Встроенные сериализаторы
-
class serializers.JSONSerializer -
Обёртка над JSON-сериализатором из
django.core.signing. Может сериализовать только базовые типы данных.Кроме того, поскольку JSON поддерживает только строковые ключи, обратите внимание, что использование нестроковых ключей в
request.sessionне будет работать должным образом:>>> # initial assignment >>> request.session[0] = 'bar' >>> # subsequent requests following serialization & deserialization >>> # of session data >>> request.session[0] # KeyError >>> request.session['0'] 'bar'
Аналогично, данные, которые нельзя закодировать в JSON, такие как не-UTF8 байты, например,
'\xd9'(что вызываетUnicodeDecodeError), нельзя хранить.См. раздел Написание собственного сериализатора для получения дополнительной информации об ограничениях сериализации JSON.
-
class serializers.PickleSerializer -
Поддерживает произвольные объекты Python, но, как описано выше, может привести к уязвимости удалённого выполнения кода, если
SECRET_KEYстанет известен злоумышленнику.
Написание собственного сериализатора
Обратите внимание, что в отличие от PickleSerializer, JSONSerializer не может обрабатывать произвольные типы данных Python. Как часто бывает, существует компромисс между удобством и безопасностью. Если вы хотите хранить более сложные типы данных, включая datetime и Decimal в сессиях на основе JSON, вам потребуется написать пользовательский сериализатор (или преобразовать такие значения в сериализуемый в JSON объект перед их хранением в request.session). Хотя сериализация этих значений довольно проста (DjangoJSONEncoder может быть полезен), написание декодера, который надежно восстановит то же самое, что вы ввели, более хрупкое. Например, вы рискуете вернуть datetime, который на самом деле был строкой, которая просто оказалась в том же формате, который был выбран для datetime.
Класс вашего сериализатора должен реализовывать два метода, dumps(self, obj) и loads(self, data), для сериализации и десериализации словаря данных сессии соответственно.
Рекомендации по объектам сессии
- Используйте обычные строки Python в качестве ключей словаря в
request.session. Это больше соглашение, чем жёсткое правило. - Ключи словаря сессии, начинающиеся с символа подчеркивания, зарезервированы для внутреннего использования Django.
- Не перезаписывайте
request.sessionновым объектом и не обращайтесь к его атрибутам или не устанавливайте их. Используйте его как словарь Python.
Примеры
Этот упрощенный вид устанавливает переменную has_commented в значение True после того, как пользователь отправил комментарий. Он не позволяет пользователю отправлять комментарий более одного раза:
def post_comment(request, new_comment):
if request.session.get('has_commented', False):
return HttpResponse("You've already commented.")
c = comments.Comment(comment=new_comment)
c.save()
request.session['has_commented'] = True
return HttpResponse('Thanks for your comment!')
Этот упрощенный вид выполняет вход «члена» сайта:
def login(request):
m = Member.objects.get(username=request.POST['username'])
if m.password == request.POST['password']:
request.session['member_id'] = m.id
return HttpResponse("You're logged in.")
else:
return HttpResponse("Your username and password didn't match.")
…А этот вид выполняет выход члена, согласно login() выше:
def logout(request):
try:
del request.session['member_id']
except KeyError:
pass
return HttpResponse("You're logged out.")
Стандартная функция django.contrib.auth.logout() фактически делает немного больше, чем это, чтобы предотвратить непреднамеренную утечку данных. Она вызывает метод flush() объекта request.session. Мы используем этот пример для демонстрации работы с объектами сессии, а не для полного logout() реализации.
Установка тестовых файлов cookie
Эта неловкая разборка между set_test_cookie() и test_cookie_worked() необходима из-за работы файлов cookie. Когда вы устанавливаете файл cookie, вы не можете точно сказать, принял ли его браузер, пока браузер не сделает следующий запрос.
Хорошей практикой является использование delete_test_cookie(), чтобы очистить за собой. Сделайте это после того, как вы подтвердили, что тестовый файл cookie сработал.
Вот типичный пример использования:
from django.http import HttpResponse
from django.shortcuts import render
def login(request):
if request.method == 'POST':
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
return HttpResponse("You're logged in.")
else:
return HttpResponse("Please enable cookies and try again.")
request.session.set_test_cookie()
return render(request, 'foo/login_form.html')
Использование сессий вне представлений
Примечание
Примеры в этом разделе импортируют объект SessionStore напрямую из бэкэнда django.contrib.sessions.backends.db. В вашем собственном коде следует рассмотреть импорт SessionStore из модуля сессий, указанного в SESSION_ENGINE, как показано ниже:
>>> from importlib import import_module >>> from django.conf import settings >>> SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
Доступен API для управления данными сессии вне представления:
>>> from django.contrib.sessions.backends.db import SessionStore >>> s = SessionStore() >>> # stored as seconds since epoch since datetimes are not serializable in JSON. >>> s['last_login'] = 1376587691 >>> s.create() >>> s.session_key '2b1189a188b44ad18c35e113ac6ceead' >>> s = SessionStore(session_key='2b1189a188b44ad18c35e113ac6ceead') >>> s['last_login'] 1376587691
SessionStore.create() предназначен для создания новой сессии (т. е. сессии, которая не загружена из хранилища сессий и у которой session_key=None). save() предназначен для сохранения существующей сессии (т. е. сессии, загруженной из хранилища сессий). Вызов save() для новой сессии также может сработать, но существует небольшой шанс, что будет сгенерирован session_key, который конфликтует с существующей. create() вызывает save() и циклически ищет до тех пор, пока не будет сгенерирована неиспользуемая session_key.
Если вы используете бэкэнд django.contrib.sessions.backends.db, каждая сессия – просто обычная модель Django. Модель Session определена в django/contrib/sessions/models.py. Поскольку это обычная модель, вы можете получать доступ к сессиям, используя обычный API базы данных Django:
>>> from django.contrib.sessions.models import Session >>> s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead') >>> s.expire_date datetime.datetime(2005, 8, 20, 13, 35, 12)
Обратите внимание, что вам необходимо вызвать get_decoded(), чтобы получить словарь сессии. Это необходимо, потому что словарь хранится в закодированном формате:
>>> s.session_data
'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...'
>>> s.get_decoded()
{'user_id': 42}
Когда сессии сохраняются
По умолчанию Django сохраняет данные в базе данных сессии только тогда, когда сессия была изменена – то есть, если какие-либо значения словаря были назначены или удалены:
# Session is modified.
request.session['foo'] = 'bar'
# Session is modified.
del request.session['foo']
# Session is modified.
request.session['foo'] = {}
# Gotcha: Session is NOT modified, because this alters
# request.session['foo'] instead of request.session.
request.session['foo']['bar'] = 'baz'
В последнем случае из приведенного выше примера мы можем явно указать объекту сессии, что он был изменен, установив атрибут modified в объекте сессии:
request.session.modified = True
Чтобы изменить это поведение по умолчанию, установите параметр SESSION_SAVE_EVERY_REQUEST в значение True. Если он установлен в значение True, Django будет сохранять сессию в базе данных на каждом запросе.
Обратите внимание, что файл cookie сессии отправляется только при создании или изменении сессии. Если SESSION_SAVE_EVERY_REQUEST имеет значение True, файл cookie сессии будет отправляться на каждом запросе.
Аналогично, часть expires файла cookie сессии обновляется каждый раз, когда отправляется файл cookie сессии.
Сессия не сохраняется, если код состояния ответа – 500.
Сессии на время работы браузера и постоянные сессии
Вы можете управлять использованием сессий на время работы браузера или постоянных сессий с помощью параметра SESSION_EXPIRE_AT_BROWSER_CLOSE.
По умолчанию SESSION_EXPIRE_AT_BROWSER_CLOSE установлен в значение False, что означает, что файлы cookie сессии будут храниться в браузерах пользователей до тех пор, пока не истечёт срок действия SESSION_COOKIE_AGE. Используйте это, если не хотите, чтобы пользователи каждый раз при открытии браузера проходили вход.
Если SESSION_EXPIRE_AT_BROWSER_CLOSE установлен на значение True, Django будет использовать файлы cookie с длительностью работы браузера – файлы cookie, которые истекают сразу после того, как пользователь закроет браузер. Используйте это, если вы хотите, чтобы пользователи каждый раз при открытии браузера проходили вход.
Этот параметр является глобальным значением по умолчанию и может быть перезаписан на уровне отдельной сессии, вызывая метод set_expiry() объекта request.session, как описано выше в разделе использование сессий в представлениях.
Примечание
Некоторые браузеры (например, Chrome) предоставляют настройки, которые позволяют пользователям продолжать сессии просмотра после закрытия и повторного открытия браузера. В некоторых случаях это может повлиять на настройку SESSION_EXPIRE_AT_BROWSER_CLOSE и помешать истечению сессий при закрытии браузера. Обратите внимание на это при тестировании приложений Django, в которых включена настройка SESSION_EXPIRE_AT_BROWSER_CLOSE.
Очистка хранилища сессий
По мере создания новых сессий на вашем веб-сайте данные сессий могут накапливаться в хранилище сессий. Если вы используете бэкэнд базы данных, таблица базы данных django_session будет расти. Если вы используете файловый бэкэнд, ваш временный каталог будет содержать всё большее количество файлов.
Чтобы понять эту проблему, рассмотрим, что происходит с бэкэндом базы данных. Когда пользователь входит в систему, Django добавляет строку в таблицу базы данных django_session. Django обновляет эту строку каждый раз, когда изменяются данные сессии. Если пользователь выходит из системы вручную, Django удаляет строку. Но если пользователь не выходит из системы, строка никогда не удаляется. Аналогичный процесс происходит с файловым бэкэндом.
Django не предоставляет автоматического удаления устаревших сессий. Поэтому вам нужно регулярно удалять устаревшие сессии. Для этой цели Django предоставляет команду управления очистки: clearsessions. Рекомендуется вызывать эту команду регулярно, например, как ежедневную задачу cron.
Обратите внимание, что бэкэнд кэша не подвержен этой проблеме, потому что кэши автоматически удаляют устаревшие данные. Также не подвержен проблеме бэкэнд файлов cookie, поскольку данные сессии хранятся в браузерах пользователей.
Настройки
Несколько настроек Django дают вам контроль над поведением сессий:
SESSION_CACHE_ALIASSESSION_COOKIE_AGESESSION_COOKIE_DOMAINSESSION_COOKIE_HTTPONLYSESSION_COOKIE_NAMESESSION_COOKIE_PATHSESSION_COOKIE_SECURESESSION_ENGINESESSION_EXPIRE_AT_BROWSER_CLOSESESSION_FILE_PATHSESSION_SAVE_EVERY_REQUESTSESSION_SERIALIZER
Безопасность сессий
Поддомены на сайте могут устанавливать cookie на клиенте для всего домена. Это делает возможным фиксацию сессии, если cookie разрешены от поддоменов, не контролируемых надёжными пользователями.
Например, злоумышленник может войти на good.example.com и получить действительную сессию для своей учётной записи. Если злоумышленник контролирует bad.example.com, он может использовать его для отправки своего ключа сессии, так как поддомен разрешён для установки cookie на *.example.com. Когда вы посещаете good.example.com, вы войдёте как злоумышленник и, возможно, ненамеренно введёте свои конфиденциальные данные (например, данные кредитной карты) в учётную запись злоумышленника.
Ещё одна возможная атака произойдёт, если good.example.com установит свой SESSION_COOKIE_DOMAIN на ".example.com", что приведёт к отправке cookie сессии с этого сайта на bad.example.com.
Технические детали
- Словарь сессии принимает любой
jsonсериализуемый объект при использованииJSONSerializerили любой пиклируемый Python-объект при использованииPickleSerializer. Для получения дополнительной информации обратитесь к модулюpickle. - Данные сессии хранятся в таблице базы данных под названием
django_session. - Django отправляет cookie только в случае необходимости. Если вы не установили никаких данных сессии, cookie сессии не будет отправлено.
Объект SessionStore
При внутренней работе с сессиями Django использует объект хранилища сессии из соответствующего движка сессий. По соглашению, класс объекта хранилища сессии называется SessionStore и расположен в модуле, указанном в SESSION_ENGINE.
Все классы SessionStore доступные в Django наследуются от SessionBase и реализуют методы обработки данных, а именно:
exists()create()save()delete()load()clear_expired()
Для создания собственного движка сессий или для настройки существующего можно создать новый класс, наследующийся от SessionBase или любого другого существующего класса SessionStore.
Расширение большинства движков сессий довольно просто, но для расширения движков сессий на базе БД обычно требуется дополнительная работа (подробности см. в следующем разделе).
Расширение движков сессий на базе БД
Создание настраиваемого движка сессий на базе БД, построенного на основе тех, что включены в Django (а именно db и cached_db), может быть выполнено путём наследования AbstractBaseSession и класса SessionStore.
AbstractBaseSession и BaseSessionManager импортируются из django.contrib.sessions.base_session, чтобы их можно было импортировать без включения django.contrib.sessions в INSTALLED_APPS.
-
class base_session.AbstractBaseSession -
Новое в Django 1.9.
Абстрактная базовая модель сессии.
-
session_key -
Первичный ключ. Само поле может содержать до 40 символов. Текущая реализация генерирует строку из 32 символов (случайная последовательность цифр и строчных букв ASCII).
-
session_data -
Строка, содержащая закодированный и сериализованный словарь сессии.
-
expire_date -
Дата и время истечения срока действия сессии.
Истекшие сессии недоступны пользователю, однако они всё ещё могут храниться в базе данных до тех пор, пока не выполнится команда управления
clearsessions.
-
classmethod get_session_store_class() -
Возвращает класс хранилища сессии, который будет использоваться с этой моделью сессии.
-
get_decoded() -
Возвращает раскодированные данные сессии.
Декодирование выполняется классом хранилища сессии.
-
Также вы можете настроить менеджер модели, унаследовав от BaseSessionManager:
-
class base_session.BaseSessionManager -
Новое в Django 1.9.
-
encode(session_dict) -
Возвращает заданный словарь сессии, сериализованный и закодированный как строка.
Кодирование выполняется классом хранилища сессии, связанным с классом модели.
-
save(session_key, session_dict, expire_date) -
Сохраняет данные сессии для заданного ключа сессии или удаляет сессию, если данные пустые.
-
Настройка классов SessionStore выполняется путём переопределения методов и свойств, описанных ниже:
-
class backends.db.SessionStore -
Реализует хранилище сессий на базе БД.
-
classmethod get_model_class() -
Новое в Django 1.9.
Переопределите этот метод, чтобы вернуть пользовательскую модель сессии, если это необходимо.
-
create_model_instance(data) -
Новое в Django 1.9.
Возвращает новый экземпляр объекта модели сессии, представляющий текущее состояние сессии.
Переопределение этого метода предоставляет возможность модифицировать данные модели сессии перед сохранением в базе данных.
-
-
class backends.cached_db.SessionStore -
Реализует кэшированное хранилище сессий на базе БД.
-
cache_key_prefix -
Новое в Django 1.9.
Префикс, добавляемый к ключу сессии для создания строки ключа кэша.
-
Пример
Пример ниже демонстрирует пользовательский движок сессий на базе БД, включающий дополнительный столбец базы данных для хранения идентификатора учётной записи (предоставляя возможность запросить в базе данных все активные сессии для учётной записи):
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
class CustomSession(AbstractBaseSession):
account_id = models.IntegerField(null=True, db_index=True)
@classmethod
def get_session_store_class(cls):
return SessionStore
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return CustomSession
def create_model_instance(self, data):
obj = super(SessionStore, self).create_model_instance(data)
try:
account_id = int(data.get('_auth_user_id'))
except (ValueError, TypeError):
account_id = None
obj.account_id = account_id
return obj
Если вы мигрируете от встроенного движка сессий Django к пользовательскому на основе cached_db, вы должны переопределить префикс ключа кэша, чтобы предотвратить конфликт имён:
class SessionStore(CachedDBStore):
cache_key_prefix = 'mysessions.custom_cached_db_backend'
# ...
Идентификаторы сессий в URL-адресах
Фреймворк Django для сессий полностью и исключительно основан на cookie. Он не использует URL-адреса для идентификаторов сессий в качестве крайнего решения, как PHP. Это преднамеренное конструкторское решение. Такое поведение не только делает URL-адреса некрасивыми, но и делает ваш сайт уязвимым к краже идентификаторов сессий через заголовок «Referer».
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/topics/http/sessions/