Куки представляют самый простой способ сохранить данные пользователя. Куки хранятся на компьютере пользователя и могут устанавливаться как на сервере, так и на клиенте. Так как куки посылаются с каждым запросом на сервер, то их максимальный размер ограничен 4096 байтами. Рассмотрим, как отправить клиенту и получить от клиента куки в приложении на Django.
За установку куки и отправку их клиенту отвечает метод set_cookie() класса HttpResponse. Этот метод имеет следующую сигнатуру:
set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)¶
Параметры метода:
key: ключ или имя куки
value: значение куки
max_age: максимальное время жизни куки в секундах. Это может быть либо объект timedelta
,
либо число, либо значение None
(ограничивает время жизни куки текущей сессией браузера, является значением по умолчанию).
expires: время и дата, когда истекает действие куки. Должен представлять строку в формате "Wdy, DD-Mon-YY HH:MM:SS GMT" или объект datetime.datetime
path: путь, для которого устанавливаются куки
domain: домен, к которому применяются куки
secure: устанавливает используемый протокол. Так, если имеет значение True
, то куки будут посылаться на сервер только в запросе по протоколу https
httponly: устанавлиет доступность для скриптов javascript на клиенте. Так, значение httponly=True
предотвращает доступ к куки из кода javascript на клиенте
samesite: устанавливает разрешения на отправку куки в кроссдоменных запросах. Так, значения
samesite='Strict'
и samesite='Lax'
указывают браузеру не посылать куки в
кроссдоменных запросах. Значение по умолчанию samesite='None'
разрешает отправку куки в кроссдоменных запросах
Также класс HttpResponse предоставляет еще один метод для установки кук:
set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
Данный метод принимает те же параметры, его отличие в том, что он применяет шифрование. Необязательный параметр salt
позволяет задать соль для шифрования.
Например, установим куки. Пусть в файле views.py имеется следующая функция:
from django.http import HttpResponse # установка куки def set(request): # получаем из строки запроса имя пользователя username = request.GET.get("username", "Undefined") # создаем объект ответа response = HttpResponse(f"Hello {username}") # передаем его в куки response.set_cookie("username", username) return response
Из строки запроса получаем значение параметра "username" и передаем его в куки по одноименному ключу
Пусть в файле urls.py эта функция вызывается в запросе по пути "/set":
from django.urls import path from hello import views urlpatterns = [ path("set", views.set), ]
Обратимся к по адресу "/set", передав через строку запроса параметр username, и сервер установит куки, а браузер сохранит их. И мы сможем их увидеть через инструменты разработчика:
Если куки не шифрованные, то для их получения у объекта HttpRequest можно использовать атрибут COOKIES, который представляет словарь.
Если куки шифрованные методом set_signed_cookie
, то для их получения в классе HttpRequest применяется метод
get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
Параметры метода:
key: ключ куки, которые надо получить
default: значение по умолчанию, если куки с указанным ключом отсутствуют в запросе
max_age: максимальное время жизни куки в секундах
salt: соль шифрования, должен иметь то же самое значение, которое передавалось в set_signed_cookie
Например, получим ранее установленные куки по ключу. Определим в файле views.py дополнительную функцию get():
from django.http import HttpResponse # установка куки def set(request): # получаем из строки запроса имя пользователя username = request.GET.get("username", "Undefined") response = HttpResponse(f"Hello {username}") # передаем его в куки response.set_cookie("username", username) return response # получение куки def get(request): # получаем куки с ключом username username = request.COOKIES["username"] return HttpResponse(f"Hello {username}")
С помощью выражения request.COOKIES["username"]
получаем куки по ключу "username" и передаем их значение в ответ клиенту.
Пусть в файле urls.py эта функция вызывается в запросе по пути "/get":
from django.urls import path from hello import views urlpatterns = [ path("set", views.set), path("get", views.get), ]
Обратимся к по адресу "/get" и получим ранее установленную куку username: