Сообщить об ошибке.

Работа с cookie в приложении на Flask Python

Как устанавливать и читать 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(), если он виден откуда вызывается код. Атрибут домена и/или пути не будет иметь значения при чтении.

Удалить куки:

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 не вызывает никаких исключений и не возвращает никакого значения.