Django Cookies в Python — методы работы и примеры
В этом руководстве вы узнаете о файлах cookie и о том, как устанавливать и получать их в веб-приложениях Django в Python.
Что такое HTTP-cookie
Когда веб-сервер взаимодействует с множеством различных браузеров одновременно, ему необходимо определить, с какого браузера поступил конкретный запрос. Поскольку HTTP-запрос/ответ не имеет состояния, все веб-браузеры выглядят одинаково. Для идентификации веб-браузеров веб-сервер использует файлы cookie.
Технически, файлы cookie представляют собой текстовые файлы с небольшим фрагментом данных, которые веб-сервер отправляет веб-браузеру. Веб-браузер может хранить файл cookie и отправлять его обратно веб-серверу в последующих запросах.
Обратите внимание, что веб-браузер отправляет обратно только те файлы cookie, которые были изначально установлены тем же веб-сервером. Сравнивая файлы cookie, веб-сервер может определить, что запросы поступают из одного и того же веб-браузера.
У файлов cookie есть срок действия. Некоторые из них могут существовать годами, в то время как другие являются краткосрочными и истекают, как только вы закрываете веб-браузер.
Django Cookies
Django позволяет устанавливать, читать и удалять файлы cookie с помощью методов объекта HttpResponse.
Установка
Чтобы установить cookie, используйте метод set_cookie() объекта HttpResponse:
set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None
В этом методе:
- key — это имя cookie-файла.
- value — это строка, представляющая значение cookie-файла.
- max_age может быть объектом timedelta или целым числом, которое обозначает количество секунд, указывающее, как долго должен истечь срок действия cookie. По умолчанию установлено значение None, при котором срок действия cookie истекает после закрытия браузера.
- expires должен быть либо объектом datetime в формате UTC, либо строкой в формате «Wdy, DD-Mon-YY HH:MM:SS GMT».
- Используйте secure=True, если вы хотите, чтобы веб-браузер отправлял cookie-файлы на сервер, если запрос выполняется только по протоколу HTTPS.
- Используйте httponly=True, если вы не хотите, чтобы клиентский JavaScript имел доступ к cookie-файлу.
- Используйте samesite=’None'((string), чтобы разрешить отправку cookie-файлов со всеми односайтовыми и межсайтовыми запросами.
Удаление
Чтобы удалить cookie, используйте метод delete_cookie() объекта HttpResponse:
delete_cookie(key, path='/', domain=None, samesite=None)
Метод delete_cookie() удаляет cookie с указанным именем. Он завершается молчаливым сбоем, если ключ не существует.
Обратите внимание, что путь и домен должны иметь те же значения, которые вы использовали в методе set_cookie(), иначе файл cookie не будет удален.
Чтение файлов cookie
Чтобы получить доступ ко всем файлам cookie, отправленным веб-браузером, используйте свойство COOKIES объекта HttpRequest.
request.COOKIES
Чтобы получить доступ к cookie по ключу, вы передаете имя cookie в словарь request.COOKIES. Например:
request.COOKIES['cocoa']
Если cookie-файл «cocoa» не существует, Django выдаст ошибку.
Чтобы избежать ошибки, вы можете использовать метод get() словаря, чтобы получить cookie, если он существует, или получить значение по умолчанию в противном случае. Например:
request.COOKIES.get('cocoa',1)
Код вернет 1, если cookie с именем «cocao» не существует.
Пример файлов cookie Django
Мы будем использовать cookie для хранения того, посетил ли веб-браузер сайт. Когда пользователь посещает сайт в первый раз, будет показано сообщение:
Welcome to my website!
А со второго раза он проверит cookie и покажет следующее сообщение, если cookie с именем, которое он посетил, доступен:
Welcome back!
Сначала определите новую запись в urlpatterns файла urls.py вашего приложения:
urlpatterns = [ path('', views.home, name='home'), ]
При открытии http://127.0.0.1:8000/ Django выполнит функцию home() в файле views.py.
Во-вторых, определите функцию home() в файле views.py:
def home(request): visited = request.COOKIES.get('visited') if visited: response = HttpResponse('Welcome back!') else: response = HttpResponse('Welcome to my website!') response.set_cookie('visited', True) return response
В функции home() мы считываем cookie с именем visited. Если cookie с именем visited не существует, на домашней странице отобразится сообщение:
Welcome to my website!
В противном случае будет показано сообщение:
Welcome back!
Кроме того, мы устанавливаем для посещенного cookie значение True.
Если вы просмотрите файл cookie в веб-браузере, вы увидите файл cookie с именем visited следующим образом: