Куки представляют самый простой способ сохранить данные пользователя. Куки хранятся на компьютере пользователя и могут устанавливаться как на сервере, так и на клиенте. Так как куки посылаются с каждым запросом на сервер, то их максимальный размер ограничен 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: