Отправка и получение кук

Последнее обновление: 19.08.2022

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

Установка куки в Django и Python

Получение куки

Если куки не шифрованные, то для их получения у объекта 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:

Получение куки в Django и Python
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850