Django имеет фреймворк сессий, который поддерживает как анонимные, так и пользовательские сессии. Django использует промежуточное программное обеспечение сессий для отправки и получения куки.
На следующем рисунке показано, как работают сеансы Django:

Когда веб-браузер делает первый HTTP-запрос к веб-серверу, промежуточное программное обеспечение сеанса начинает новый сеанс. Промежуточное программное обеспечение сеанса генерирует большое и случайное число, которое называется идентификатором сеанса, и отправляет его обратно в веб-браузер в виде cookie.
Для последующих запросов промежуточное программное обеспечение сеанса сопоставляет значение sessionid в файле cookie, отправленном веб-браузером, с идентификатором сеанса, хранящимся на веб-сервере, и связывает данные сеанса с объектом HTTP-запроса.
Чтобы использовать сеансы, вам необходимо убедиться, что настройки MIDDLEWARE вашего проекта(settings.py) содержат промежуточное программное обеспечение сеанса, например:
MIDDLEWARE = [
# other middleware
'django.contrib.sessions.middleware.SessionMiddleware',
# ...
]
Промежуточное программное обеспечение сеанса добавляется в MIDDLEWARE по умолчанию при создании нового проекта с помощью команды startproject.
Промежуточное программное обеспечение сеанса включает сеансы через свойство сеанса объекта запроса(HttpRequest):
request.session
Request.session — это словарь, который позволяет вам хранить и извлекать данные сеанса. Request.session принимает любой объект, который может быть сериализован в JSON по умолчанию.
В отличие от других объектов, request.session сохраняется от одного HTTP-запроса до следующего запроса.
Чтобы установить переменную в сеансе, вы можете использовать request.session следующим образом:
request.session['visit'] = 1
Этот оператор устанавливает переменную посещения на 1.
Чтобы получить ключ сеанса, используйте метод get() объекта request.session:
request.session.get('visit')
Чтобы удалить ключ в сеансе, используйте оператор del:
del request.session['visit']
Настройка Django sessions
По умолчанию Django хранит данные сеанса в базе данных, используя модель сеанса приложения django.contrib.sessions. Однако вы можете выбрать другие движки сеанса, используя SESSION_ENGINE.
Django предоставляет вам следующие возможности хранения данных сеанса:
| Параметры | Описание |
|---|---|
| File-based sessions | Сохраните данные сеанса в django_session базы данных. Это движок по умолчанию. |
| Cached sessions | Сохраните данные сеанса в файловой системе. |
| Cached database sessions | Сохраните данные сеанса в кэш-бэкенде. Чтобы задать кэш-бэкенд, используйте настройку CACHES. |
| Cached database sessions | Сохраните данные сеанса в кэше сквозной записи и базе данных. Если данные отсутствуют в кэше, Django прочитает данные сеанса из базы данных. |
| Cookie-based sessions | Сохранять данные сеанса в файлах cookie, которые отправляются в веб-браузер. |
Обратите внимание, что механизм сеансов на основе кэширования обеспечивает лучшую производительность по сравнению с другими механизмами сеансов.
Django поддерживает Memcached из коробки. Кроме того, вы можете найти сторонний пакет для управления бэкэндами кэша для Redis и других систем кэширования.
Помимо SESSION_ENGINE, Django позволяет вам настраивать сессии с помощью определенных настроек. В следующей таблице перечислены наиболее важные из них:
| Настройки сеанса | Описание |
|---|---|
| SESSION_COOKIE_AGE | Длительность сеансовых куки в сеансе. По умолчанию — две недели(1 209 600 секунд) |
| SESSION_COOKIE_DOMAIN | Установите домен для сеансовых файлов cookie. |
| SESSION_COOKIE_HTTPONLY | Установите значение True, чтобы запретить JavaScript доступ к cookie-файлу сеанса. Значение по умолчанию True, что повышает безопасность от перехвата сеанса пользователя. |
| SESSION_COOKIE_SECURE | Установите значение True, чтобы указать, что cookie-файл должен отправляться только в случае HTTPS-соединения. По умолчанию установлено значение False. |
| СЕССИЯ_EXPIRE_AT_BROWSER_CLOSE | Установите значение True, чтобы сеанс истекал при закрытии браузера. Значение по умолчанию — False. Если установить значение True, SESSION_COOKIE_AGE не будет иметь никакого эффекта. |
| SESSION_SAVE_EVERY_REQUEST | Установите значение True, чтобы сохранить сеанс и обновить срок действия сеанса в базе данных при каждом запросе. По умолчанию установлено значение False. |
Пример Django sessions
Сначала добавьте URL-адрес в urlpatterns в файле urls.py:
urlpatterns = [
path('visit/', views.count_visit, name="visit")
]
При переходе по адресу http://localhost:8000/visit будет выполнена функция count_visit в views.py.
Во-вторых, определите функцию count_visit() в файле views.py:
def count_visit(request):
visit = request.session.get('visit',0) + 1
request.session['visit'] = visit
return HttpResponse(f"Visit count:{request.session['visit']}")
Функция count_visit() использует request.session для увеличения переменной visit каждый раз, когда вы посещаете URL-адрес http://localhost:8000/visit. Она также отображает текущее значение переменной visit на веб-странице:
Если вы просмотрите файлы cookie в веб-браузере, вы увидите файл cookie с именем sessionid:

Значение sessionid соответствует session_key в таблице django_session:

Данные сеанса представляют собой строку, закодированную с помощью base64. Для ее анализа используется следующий код:
from base64 import b64decode
data = base64decode('eyJ2aXNpdCI6MTF9:1ov84c:qngX5Woil1EDwGGylot0OrQtche6734UOApKJ4yp-BA')
print(data)
Выход:
b'{"visit":11}\xd6\x8b\xfc\xe1\xca\xa7\x81~V\xa2)u\x10<\x06\x1b)h\xb7C\xabB\xd7!{\xae\xf7\xe1C\x80\xa4\xa2x\xca\x90@'
