Как устанавливать и читать cookie в приложении на Flask.
Содержание:
Что такое файлы cookie
?
Файлы cookie
хранится в браузере клиента в виде текстовых файлов. Цель файлов cookie
- запоминать и отслеживать данные, относящиеся к использованию клиентом сайта, для лучшего взаимодействия с посетителями, а так же статистики сайта.
Минусы файлов cookie
:
- Файлы
cookie
небезопасны. Данные, которые в них хранятся, видны всем, поэтому в куки нельзя хранить пароли, данные банковских карт и так далее. - Файлы
cookie
можно отключить. Большинство браузеров дают пользователям возможность отключить куки. Если это происходит, никакого предупреждения нет.
В веб разработке, в основном, для отправки файла
cookie
с сервера, пользовательскому агенту, используется заголовок
HEADER
HTTP-ответа
Set-Cookie
, при этом, чтобы отправить несколько файлов
cookie
, необходимо отправить несколько заголовков
Set-Cookie
в одном ответе. Дополнительно смотрите
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-CookieФреймворк Flask упрощает работу с этим типом заголовка, предоставляя три метода, для управления cookie
:
Чтение cookie
средствами Flask.
Объект запроса
flask.Request
содержит атрибут
Request.cookie
. Это
словарь всех переменных
cookie
и их соответствующих им значений, переданных клиентом. В дополнение к этому,
cookie
также хранит время истечения срока действия, путь, доменное имя сайта и т. д.
Прочитать файл cookie
очень легко, для этого нужно использовать метод словаря
dict.get()
для атрибута
request.cookies
.
@app.route('/getcookie')
def getcookie():
# читаем cookie с именем 'user'
name = request.cookies.get('user')
return f'<h1>Cookie user={name}</h1>'
Установка cookie
средствами Flask.
Фреймворк Flask устанавливает файлы
cookie
в объект ответа
flask.Response
. Для того, что бы установить
cookie
клиенту, сначала необходимо получить объект ответа
Response
в функции-представлении при помощи функции
flask.make_response()
. После этого можно изменить ответ, установив
cookie
, используя метод
Response.set_cookie()
.
@app.route('/setcookie')
def setcookie():
context = {}
context['text'] = 'Привет Мир!'
name = 'nikolay'
# получаем объект ответа
resp = make_response(render_template('index.html', content=context))
# устанавливаем cookie 'user' со
# значением user в объект ответа
resp.set_cookie('user', name)
# возвращаем измененный ответ
return resp
Аргументы метода Response.set_cookie()
.
Синтаксис:
Response.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
Метод Response.set_cookie()
принимает следующие аргументы:
key
: строка, ключ/имя устанавливаемого файла cookie
.value
: строка, значение куки.max_age
: время жизни cookie
, указывается в секундах. По умолчанию None
, это означает что cookie
уничтожиться, после окончания сеанса браузера. Может быть int
или datetime.timedelta()
.expires
: должен быть объектом datetime.datetime()
или метка времени UNIX, обозначенная как int
или float
. path
: строка, которая ограничивает cookie
заданным путем, по умолчанию он будет охватывать весь домен.domain
: строка, которая устанавливает междоменный файл cookie
. Например, domain='.example.com'
установит cookie
, доступный для чтения доменам www.example.com
, foo.example.com
и т. д. В противном случае cookie
будет доступен для чтения только домену, который его установил.secure
: если True
, то cookie
будет доступен только через HTTPS.httponly
: если True
, то запретить доступ JavaScript к файлу cookie
.samesite
: строка, которая ограничивает действие cookie
. Другими словами, cookie
передаются только запросам, которые относятся к "samesite".
Удаление cookie
средствами Flask.
Flask так же может удалять
cookie
в объекте ответа
flask.Response
. Для того, что бы удалить
cookie
, получаем объект ответа
Response
в функции-представлении при помощи функции
flask.make_response()
. После этого изменяем ответ приложения, удаляя
cookie
методом
Response.del_cookie()
.
@app.route('/delcookie')
def delcookie():
context = {}
context['text'] = 'Привет Мир!'
name = 'nikolay'
# получаем объект ответа
resp = make_response(render_template('index.html', content=context))
# удаляем cookie 'user'
resp.del_cookie('user')
# возвращаем измененный ответ
return resp
Установка/удаление cookie
средствами JavaScript на стороне шаблона.
Не забываем, что установить/удалить файлы
cookie
можно на стороне шаблона, при помощи отличного JavaScript модуля
js-cookie
(не имеет зависимостей), что наверное, для кого-то намного проще. Для этого в контекст шаблона передаем нужные данные (например
context['name'] = 'nikolay'
), а затем, при помощи JavaScript, в шаблоне, устанавливаем
cookie
.
Примеры использования.
Создайте файл cookie, действительный для всего сайта:
Cookies.set('name', 'value');
Создайте файл cookie, срок действия которого истекает через 7 дней, действительный для всего сайта:
Cookies.set('name', 'value', { expires: 7 });
Создайте файл cookie с истекающим сроком действия, действительный для пути к текущей странице:
Cookies.set('name', 'value', { expires: 7, path: '' });
Прочитать куки:
Cookies.get('name');
// 'value'
Cookies.get('nothing');
// undefined
Прочитать все видимые файлы cookie:
Cookies.get() // => { name: 'value' };
Примечание. Невозможно прочитать конкретный файл cookie, передав один из атрибутов файла cookie (который мог использоваться или не использоваться при записи рассматриваемого файла cookie):
// не будет никакого эффекта...!
Cookies.get('foo', { domain: 'sub.example.com' });
// `domain`
Файл cookie с именем foo
будет доступен только в Cookies.get()
, если он виден откуда вызывается код. Атрибут домена и/или пути не будет иметь значения при чтении.
Удалить куки:
Удалить файл cookie, действительный для пути к текущей странице:
Cookies.set('name', 'value', { path: '' });
// файл cookie для path='' НЕ удалиться!
Cookies.remove('name');
// корректное удаление файла cookie, для path=''
Cookies.remove('name', { path: '' });
ВАЖНО! При удалении файла cookie, НЕЛЬЗЯ полагаться на атрибуты по умолчанию, НЕОБХОДИМО передавать точно такие же атрибуты пути и домена, которые использовались для установки файла cookie:
Cookies.remove('name', { path: '', domain: '.yourdomain.com' })
Примечание. Удаление несуществующего файла cookie не вызывает никаких исключений и не возвращает никакого значения.