Как использовать сессии
Django предоставляет полную поддержку анонимных сессий. Система сессий позволяет хранить и извлекать произвольные данные на основе каждого посетителя сайта. Данные хранятся на стороне сервера, и система абстрагирует процесс отправки и получения куки. Куки содержат идентификатор сессии — не сами данные (если только вы не используете базовый модуль на основе куки).
Включение сессий
Сессии реализуются с помощью модуля средства промежуточного программного обеспечения.
Чтобы включить функциональность сессий, сделайте следующее:
- Отредактируйте настройку
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 или Redis. Базовый модуль локальной памяти кэша не удерживает данные достаточно долго, чтобы быть хорошим выбором, и будет быстрее использовать файлы или сессии базы данных напрямую вместо отправки всего через базовые модули кэша файлов или базы данных. Кроме того, базовый модуль кэша локальной памяти НЕ безопасен для многопроцессных сред, поэтому, вероятно, не является хорошим выбором для производственных сред.
Если в CACHES определено несколько кэшей, Django будет использовать кэш по умолчанию. Чтобы использовать другой кэш, установите SESSION_CACHE_ALIAS в имя этого кэша.
После настройки кэша вам нужно выбрать между кэшем базы данных и непостоянным кэшем.
Базовый модуль кэширования базы данных (cached_db) использует проходящий через кэш — записи сессий применяются к базе данных и кэшу в таком порядке. Если запись в кэш завершается сбоем, исключение обрабатывается и регистрируется с помощью журнализатора сессий, чтобы избежать сбоя в противном случае успешной записи.
Была добавлена обработка и регистрация исключений при записи в кэш.
Чтение сессий использует кэш или базу данных, если данные были удалены из кэша. Чтобы использовать этот базовый модуль, установите SESSION_ENGINE в "django.contrib.sessions.backends.cached_db" и следуйте инструкциям по настройке для использования сессий, поддерживаемых базой данных.
Базовый модуль кэша (cache) хранит данные сессий только в кэше. Это быстрее, потому что избегает сохранения в базе данных, но вам нужно учесть, что произойдет, когда данные кэша будут удалены. Удаление может произойти, если кэш заполнится или сервер кэша перезагрузится, и это приведет к потере данных сессий, в том числе к выходу пользователей из системы. Чтобы использовать этот базовый модуль, установите SESSION_ENGINE в "django.contrib.sessions.backends.cache".
Базовый модуль кэша можно сделать постоянным, используя постоянный кэш, такой как Redis с соответствующей настройкой. Но если ваш кэш не настроен на достаточную постоянность, используйте базовый модуль кэширования базы данных. Это позволит избежать проблем с ненадёжным хранением данных в производстве.
Использование сессий на основе файлов
Чтобы использовать сессии на основе файлов, установите настройку SESSION_ENGINE в "django.contrib.sessions.backends.file".
Вы также можете установить настройку SESSION_FILE_PATH (по умолчанию она определяется значением из tempfile.gettempdir(), скорее всего, /tmp), чтобы контролировать, где Django хранит файлы сессий. Убедитесь, что ваш веб-сервер имеет разрешения на чтение и запись в этом месте.
Использование сессий в представлениях
Когда 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)
-
aget(key, default=None) -
Асинхронная версия:
aget()Пример:
fav_color = request.session.get('fav_color', 'red')Изменено в Django 5.1:aget()функция была добавлена.
-
aset(key, value) -
Новое в Django 5.1.
Пример:
await request.session.aset('fav_color', 'red')
-
update(dict)
-
aupdate(dict) -
Асинхронная версия:
aupdate()Пример:
request.session.update({'fav_color': 'red'})Изменено в Django 5.1:aupdate()функция была добавлена.
-
pop(key, default=__not_given)
-
apop(key, default=__not_given) -
Асинхронная версия:
apop()Пример:
fav_color = request.session.pop('fav_color', 'blue')Изменено в Django 5.1:apop()функция была добавлена.
-
keys()
-
akeys() -
Асинхронная версия:
akeys()Изменено в Django 5.1:akeys()функция была добавлена.
-
values()
-
avalues() -
Асинхронная версия:
avalues()Изменено в Django 5.1:avalues()функция была добавлена.
-
has_key(key)
-
ahas_key(key) -
Асинхронная версия:
ahas_key()Изменено в Django 5.1:ahas_key()функция была добавлена.
-
items()
-
aitems() -
Асинхронная версия:
aitems()Изменено в Django 5.1:aitems()функция была добавлена.
-
setdefault()
-
asetdefault() -
Асинхронная версия:
asetdefault()Изменено в Django 5.1:asetdefault()функция была добавлена.
-
clear()
Также у него есть эти методы:
-
flush()
-
aflush() -
Асинхронная версия:
aflush()Удаляет текущие данные сессии из сессии и удаляет куки сессии. Это используется, если вы хотите убедиться, что к данным предыдущей сессии больше нельзя получить доступ из браузера пользователя (например, функция
django.contrib.auth.logout()вызывает её).Изменено в Django 5.1:aflush()функция была добавлена.
-
set_test_cookie()
-
aset_test_cookie() -
Асинхронная версия:
aset_test_cookie()Устанавливает тестовый куки для определения того, поддерживает ли браузер пользователя куки. Из-за того, как работают куки, вы не сможете протестировать это до следующего запроса страницы пользователем. Подробнее об этом см. в разделе «Установка тестовых куки» ниже.
Изменено в Django 5.1:aset_test_cookie()функция была добавлена.
-
test_cookie_worked()
-
atest_cookie_worked() -
Асинхронная версия:
atest_cookie_worked()Возвращает либо
True, либоFalse, в зависимости от того, принял ли браузер пользователя тестовый куки. Из-за того, как работают куки, вам нужно будет вызватьset_test_cookie()илиaset_test_cookie()в предыдущем отдельном запросе страницы. Подробнее об этом см. в разделе «Установка тестовых куки» ниже.Изменено в Django 5.1:atest_cookie_worked()функция была добавлена.
-
delete_test_cookie()
-
adelete_test_cookie() -
Асинхронная версия:
adelete_test_cookie()Удаляет тестовый куки. Используйте это, чтобы очистить за собой.
Изменено в Django 5.1:adelete_test_cookie()функция была добавлена.
-
get_session_cookie_age() -
Возвращает значение настройки
SESSION_COOKIE_AGE. Это можно переопределить в пользовательском обработчике сессий.
-
set_expiry(value)
-
aset_expiry(value) -
Асинхронная версия:
aset_expiry()Устанавливает время истечения сессии. Вы можете передать различные значения:
- Если
valueявляется целым числом, сессия истечёт через это количество секунд бездействия. Например, вызовrequest.session.set_expiry(300)приведет к истечению сессии через 5 минут. - Если
valueявляется объектомdatetimeилиtimedelta, сессия истечёт в указанную дату/время. - Если
valueравно0, куки сессии пользователя истечёт при закрытии веб-браузера пользователя. - Если
valueравноNone, сессия возвращается к использованию глобальной политики истечения сессии.
Чтение сессии не считается активностью для целей истечения срока действия. Истечение срока действия сессии рассчитывается с момента последнего изменения сессии.
Изменено в Django 5.1:aset_expiry()функция была добавлена. - Если
-
get_expiry_age()
-
-
aget_expiry_age() -
Асинхронная версия:
aget_expiry_age()Возвращает количество секунд до истечения срока действия этого сеанса. Для сеансов без пользовательской настройки истечения срока действия (или тех, которые установлены для истечения при закрытии браузера), это значение равно
SESSION_COOKIE_AGE.Эта функция принимает два необязательных ключевых аргумента:
-
modification: последнее изменение сеанса в виде объектаdatetime. По умолчанию — текущее время. -
expiry: информация об истечении срока действия сеанса в виде объектаdatetime, целого числа (в секундах) илиNone. По умолчанию — значение, хранящееся в сеансе методомset_expiry()/aset_expiry(), если таковое имеется, илиNone.
Примечание
Этот метод используется хранилищами сеансов для определения возраста истечения сеанса в секундах при сохранении сеанса. Он не предназначен для использования вне этого контекста.
В частности, хотя возможно определить оставшийся срок действия сеанса только когда у вас есть правильное значение
modificationиexpiryустановлено как объектdatetime, где у вас есть значениеmodification, проще рассчитать срок действия вручную:expires_at = modification + timedelta(seconds=settings.SESSION_COOKIE_AGE)
Изменено в Django 5.1:Была добавлена функция
aget_expiry_age(). -
-
get_expiry_date()
-
aget_expiry_date() -
Асинхронная версия:
aget_expiry_date()Возвращает дату истечения срока действия этого сеанса. Для сеансов без пользовательской настройки истечения срока действия (или тех, которые установлены для истечения при закрытии браузера), это значение будет равно дате, наступившей через
SESSION_COOKIE_AGEсекунд от текущей.Эта функция принимает те же ключевые аргументы, что и
get_expiry_age(), и аналогичные замечания о применении к ней относятся.Изменено в Django 5.1:Была добавлена функция
aget_expiry_date().
-
get_expire_at_browser_close()
-
aget_expire_at_browser_close() -
Асинхронная версия:
aget_expire_at_browser_close()Возвращает либо
True, либоFalse, в зависимости от того, истекает ли срок действия cookie сеанса пользователя при закрытии веб-браузера.Изменено в Django 5.1:Была добавлена функция
aget_expire_at_browser_close().
-
clear_expired()
-
aclear_expired() -
Асинхронная версия:
aclear_expired()Удаляет истекшие сеансы из хранилища сеансов. Этот метод класса вызывается командой
clearsessions.Изменено в Django 5.1:Была добавлена функция
aclear_expired().
-
cycle_key()
-
acycle_key() -
Асинхронная версия:
acycle_key()Создаёт новый ключ сеанса, сохраняя при этом текущие данные сеанса. Метод
django.contrib.auth.login()вызывает этот метод, чтобы уменьшить уязвимость к фиксации сеанса.Изменено в Django 5.1:Была добавлена функция
acycle_key().
-
Сериализация сеансов
По умолчанию Django сериализует данные сеанса с помощью JSON. Вы можете настроить формат сериализации сеансов с помощью параметра SESSION_SERIALIZER. Даже с оговорками, описанными в Написать собственный сериализатор, настоятельно рекомендуется использовать JSON-сериализацию, особенно если вы используете хранилище cookie.
Например, вот сценарий атаки, если вы используете pickle для сериализации данных сеанса. Если вы используете хранилище сеансов с подписанными cookie и SECRET_KEY (или любой ключ из SECRET_KEY_FALLBACKS) известен злоумышленнику (в 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, например, байты, не являющиеся UTF-8, такие как
'\xd9'(что вызываетUnicodeDecodeError), не могут быть сохранены.См. раздел Написать собственный сериализатор для получения более подробной информации об ограничениях JSON-сериализации.
Написать собственный сериализатор
Обратите внимание, что 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.check_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() реализации.
Использование сессий вне представлений
Примечание
Примеры в этом разделе импортируют объект 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 сохранит сессию в базе данных при каждом запросе.
Обратите внимание, что куки сессии отправляются только при создании или изменении сессии. Если SESSION_SAVE_EVERY_REQUEST имеет значение True, куки сессии будут отправляться при каждом запросе.
Аналогично, часть expires куки сессии обновляется каждый раз при отправке куки сессии.
Сессия не сохраняется, если код состояния ответа равен 500.
Сессии с длительностью браузера и постоянные сессии
Вы можете управлять тем, использует ли фреймворк сессий сессии с длительностью браузера или постоянные сессии, с помощью настройки SESSION_EXPIRE_AT_BROWSER_CLOSE.
По умолчанию SESSION_EXPIRE_AT_BROWSER_CLOSE установлено в значение False, что означает, что куки сессий будут храниться в браузерах пользователей до тех пор, пока не истечёт срок действия SESSION_COOKIE_AGE. Используйте это, если не хотите, чтобы пользователи каждый раз входили в систему при открытии браузера.
Если SESSION_EXPIRE_AT_BROWSER_CLOSE установлено в значение True, Django будет использовать куки с длительностью браузера — куки, которые истекают сразу после закрытия браузера пользователем. Используйте это, если вы хотите, чтобы пользователи каждый раз входили в систему при открытии браузера.
Эта настройка является глобальным значением по умолчанию и может быть перезаписана на уровне отдельных сессий, вызывая явно метод 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.
Обратите внимание, что бэкенд кэша не подвержен этой проблеме, так как кэши автоматически удаляют устаревшие данные. Также не подвержен бэкенд куки, так как данные сессии хранятся в браузерах пользователей.
Настройки
Несколько настроек Django позволяют вам контролировать поведение сессий:
Безопасность сессий
Поддомены одного сайта могут устанавливать куки на клиенте для всего домена. Это делает возможной фиксацию сессий, если куки разрешены от поддоменов, не контролируемых надёжными пользователями.
Например, злоумышленник может войти в good.example.com и получить действительную сессию для своей учётной записи. Если злоумышленник контролирует bad.example.com, он может использовать его для отправки своего ключа сессии вам, поскольку поддомен разрешено устанавливать куки на *.example.com. Когда вы посещаете good.example.com, вы войдёте в систему как злоумышленник и можете случайно ввести свои конфиденциальные данные (например, информацию о кредитной карте) в учётную запись злоумышленника.
Другая возможная атака может произойти, если good.example.com устанавливает свой SESSION_COOKIE_DOMAIN на "example.com", что приведет к отправке куки сессии с этого сайта на bad.example.com.
Технические детали
- Словарь сессии принимает любое
jsonсериализуемое значение при использованииJSONSerializer. - Данные сессии хранятся в таблице базы данных с именем
django_session. - Django отправляет куки только в случае необходимости. Если вы не установили какие-либо данные сессии, куки сессии не будут отправлены.
Объект SessionStore
При работе с сессиями внутри Django используется объект хранилища сессий из соответствующего движка сессий. По соглашению, класс объекта хранилища сессий называется SessionStore и находится в модуле, указанном в SESSION_ENGINE.
Все SessionStore подклассы, доступные в Django, реализуют следующие методы манипулирования данными:
exists()create()save()delete()load()clear_expired()
Асинхронный интерфейс для этих методов предоставляется путём обертывания их с помощью sync_to_async(). Они могут быть реализованы напрямую, если доступна асинхронная реализация:
aexists()acreate()asave()adelete()aload()aclear_expired()
Для создания настраиваемого движка сессий или настройки существующего вы можете создать новый класс, наследующий от SessionBase или любого другого существующего SessionStore класса.
Вы можете расширять движки сессий, но при работе с движками сессий, поддерживающими базу данных, обычно требуется дополнительные усилия (см. следующий раздел для получения подробностей).
aexists(), acreate(), asave(), adelete(), aload() и aclear_expired() методы были добавлены.
Расширение движков сессий с поддержкой базы данных
Создание настраиваемого движка сессий с поддержкой базы данных, построенного на основе тех, которые включены в Django (а именно db и cached_db), можно сделать, унаследовав AbstractBaseSession и либо SessionStore класс.
AbstractBaseSession и BaseSessionManager импортируются из django.contrib.sessions.base_session, чтобы их можно было импортировать, не включая django.contrib.sessions в INSTALLED_APPS.
-
class base_session.AbstractBaseSession -
Абстрактная базовая модель сессии.
-
session_key -
Первичный ключ. Само поле может содержать до 40 символов. Текущая реализация генерирует строку из 32 символов (случайная последовательность цифр и строчных букв ASCII).
-
session_data -
Строка, содержащая закодированный и сериализованный словарь сессии.
-
expire_date -
Дата и время, обозначающие истечение срока действия сессии.
Истекшие сессии недоступны пользователю, однако они могут храниться в базе данных до тех пор, пока не будет запущен менеджер
clearsessions.
-
classmethod get_session_store_class() -
Возвращает класс хранилища сессий, который будет использоваться с этой моделью сессии.
-
get_decoded() -
Возвращает декодированные данные сессии.
Декодирование выполняется классом хранилища сессий.
-
Вы также можете настроить менеджер модели, унаследовав от BaseSessionManager:
-
class base_session.BaseSessionManager -
-
encode(session_dict) -
Возвращает сериализованный и закодированный в виде строки переданный словарь сессии.
Кодирование выполняется связанным классом хранилища сессий для класса модели.
-
save(session_key, session_dict, expire_date) -
Сохраняет данные сессии для заданного ключа сессии или удаляет сессию, если данные пусты.
-
Настройка SessionStore классов достигается путём переопределения методов и свойств, описанных ниже:
-
class backends.db.SessionStore -
Реализует хранилище сессий с поддержкой базы данных.
-
classmethod get_model_class() -
Переопределите этот метод для возвращения настраиваемой модели сессии, если она вам нужна.
-
create_model_instance(data) -
Возвращает новый экземпляр объекта модели сессии, который представляет текущее состояние сессии.
Переопределение этого метода предоставляет возможность изменить данные модели сессии перед сохранением в базе данных.
-
-
class backends.cached_db.SessionStore -
Реализует кэшируемое хранилище сессий с поддержкой базы данных.
-
cache_key_prefix -
Префикс, добавляемый к ключу сессии для создания строки ключа кеша.
-
Пример
Пример ниже демонстрирует настраиваемый движок сессий с поддержкой базы данных, который включает дополнительный столбец базы данных для хранения идентификатора учётной записи (что предоставляет возможность запросить базу данных для всех активных сессий для учётной записи):
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().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 полностью и исключительно основан на куках. Он не использует URL-адреса для хранения идентификаторов сессий в качестве крайнего средства, как это делает PHP. Это целенаправленное решение. Такое поведение не только делает URL-адреса непривлекательными, но и делает ваш сайт уязвимым для кражи идентификаторов сессий через заголовок «Referer».
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/http/sessions/