Порядок работы с cookies

Продолжим изучение возможностей фреймворка Flask, которые позже понадобятся для развития нашего тестового сайта. И следующее, о чем мы поговорим – это возможность передавать и сохранять информацию в браузере клиента в, так называемых, cookies (куках).

Сохранение информации в cookies браузера

Итак, с помощью функции make_response, которую мы рассмотрели на прошлом занятии, можно передавать информацию для cookies браузера, то есть, информация, которая будет храниться в браузере клиента и передаваться серверу при каждом очередном запросе к нашему сайту. Cookies очень часто применяются при создании сайтов. Например, в формах авторизации очень часто имеется галочка «Запомнить», которая позволяет запомнить авторизацию текущего пользователя:

Как раз это делается с помощью cookies: в них сохраняется хеш авторизации и, затем, при отправке запроса, на стороне сервера можно посмотреть наличие и корректность этого хэша. В случае успешной проверки пользователю не придется постоянно выполнять авторизацию.

Итак, чтобы работать с cookies через объект ответа, используется функция

set_cookie(key, value="", max_age=None)

  • key – название куки;
  • value – данные, которые сохраняются в cookies под указанным ключом;
  • max_age – необязательный аргумент, указывающий предельное время хранения данных cookies в барузере клиента (в секундах). Если время не указывается, то куки пропадут при закрытии браузера.

Например, этой функцией можно воспользоваться так:

from flask import Flask, render_template, make_response, url_for, request
 
app = Flask(__name__)
 
menu = [{"title": "Главная", "url": "/"},
        {"title": "Добавить статью", "url": "/add_post"}]
 
@app.route("/")
def index():
    return "<h1>Main Page</h1>"
 
@app.route("/login")
def login():
    log = ""
    if request.cookies.get('logged'):
        log = request.cookies.get('logged')
 
    res = make_response(f"<h1>Форма авторизации</h1>logged: {log}")
    res.set_cookie("logged", "yes")
    return res
 
if __name__ == "__main__":
    app.run(debug=True)

Мы здесь вначале проверяем в функции представления login: переданы ли cookies вместе с запросом к странице и если это так, то переменная log будет ссылаться на значение с ключом 'logged'. Далее, формируется объект ответа и, затем, вызывается метод set_cookie этого объекта. Через него устанавливается ключ logged со значение yes. В результате, при первом запросе формы в браузер клиента будет записано значение yes и, при повторном обращении, объект reques будет ссылаться на cookies с этим ключом.

Если же требуется сохранять куки в пределах, например, месяца, то это указывается третьим параметром:

res.set_cookie("logged", "yes", 30*24*3600)

Теперь для нашего сайта при отправке каждого запроса браузер автоматически будет добавлять информацию из cookies, которая станет доступной на сервере.

Удаление cookies

Если требуется удалить определенную информацию из cookies, то для этого в методе set_cookie достаточно установить параметр

max_age = 0

Например, так:

@app.route("/logout")
def logout():
    res = make_response("Вы больше не авторизованы!</p>")
    res.set_cookie("logged", "", 0)
    return res

Ограничения cookies

Перед использованием cookies в реальном проекте нужно знать об их особенностях. Во-первых, куки небезопасны и все данные, которые в них попадают, видны всем, поэтому в них нельзя хранить пароли, данные банковских карт и так далее. Во-вторых, в большинстве браузеров cookies можно отключать и тогда сохранять в них данные уже не получится. Причем, сервер об этом знать не будет, метод set_cookie отработает штатно, просто данные не будут размещены в браузере и сайт потеряет часть своего функционала.

Для решения этой проблемы, часто в HTML-страницах размещают JavaScript-код, который проверяет работоспособность cookies и при их отключении сообщает пользователю, что сайт будет некорректно работать в этих условиях:

<script>
    document.cookie = "ex=1;";
    if (!document.cookie)
    {
         alert("Это сайт требует включенных cookies для своей корректной работы ");
    }
</script>

Также следует знать, что на cookies накладывается ограничение по размеру в 4 Кб на каждый ключ и количеству ключей в расчете на один сайт. Обычно оно составляет от 30 до 50.

Разумеется, размеры cookies нужно делать минимальными еще и по той причине, что они добавляются в каждый запрос к серверу. Представьте, если каждый раз из-за cookies будет отправляться дополнительно:

4∙25 = 100 Кб

информации. Это не самая лучшая реализация. Нужно стараться минимизировать эту информацию.

На этом мы завершим данное занятие по кукам. На следующем продолжим эту тему и поговорим об еще одном похожем хранилище – сессиях.

Видео по теме