cookie
?cookie
средствами Flask.cookie
средствами Flask.cookie
средствами Flask.cookie
средствами JavaScript на стороне шаблона.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
осуществляется из контекста запроса методом request.cookies.get('cookie_name')
. cookie
осуществляется в объект ответа, методом response.set_cookies('cookie_name', value, ...)
. cookie
осуществляется так же, из объект ответа, методом response.del_cookies('cookie_name')
. 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()
, если он виден откуда вызывается код. Атрибут домена и/или пути не будет иметь значения при чтении.
Удалить куки:
Cookies.remove('name');
Удалить файл 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 не вызывает никаких исключений и не возвращает никакого значения.