Сессии во Flask

Flask – это функциональный фреймворк, позволяющий создавать веб-приложения. Его преимущества: гибкость, функциональность, расширяемость и компактность. 

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

Сессии чем-то похожи на куки, но имеют ряд существенных отличий. Давайте подробнее рассмотрим их особенности и то, чем они отличаются от куки, а также от сессий PHP. Также рассмотрим, как добавлять, редактировать и удалять данные сессий, устанавливать их продолжительность, и ряд других важных аспектов.

Что такое сессии во Flask?

С помощью сессий во Flask пользователь также может сохранять данные конкретных пользователей между запросами. Они работают по принципу, который похож на куки, персонализируя посещение сайтов. Чтобы использовать сессию во Flask, необходимо сначала выполнить настройку специального ключа. Он необходим для того, чтобы защитить данные сессии от редактирования. 

Но прочитать информацию, связанную с конкретной сессией, можно и без ключа. Чтобы это сделать, пользователю необходимо воспользоваться объектом session из пакета flask. В целом, это словарь по принципу работы. Но есть и отличие – в его функционал заложено отслеживание изменений.

Во время использования сессий в фреймворке Flask для Python хранение данных в браузере осуществляется в виде куки. Те куки, которые используются для хранения данных сессии – это куки сессии. Но, в отличие от обычных куки, куки сессии отмечаются криптографически. Это означает, что каждый пользователь может видеть их содержимое, но при этом не может изменять без соответствующего секретного ключа.

После того, как будет осуществлена настройка куки для определенной сессии в браузере, необходимо подтвердить подлинность с использованием секретного ключа. Если этого не получается, тогда контент отклоняется, а браузером получаются новые куки для этой сессии.

Отличия сессий PHP и Flask

Те, кто знает сессии из языка PHP, скажут: сессии во Flask несколько отличаются от него. Так и есть. В PHP куки не хранят данные, а лишь идентификатор, который являет собой уникальную строку, используемую для связи данных сессии с куки. Хранение этих сведений осуществляется на сервере в виде файла. Когда пользователь PHP получает запрос, id используется для того, чтобы найти данные и использовать их для отрисовки страницы. Этот тип сессий называется серверным. 

Те же сессии, которые используются во Flask, называются клиентскими, поскольку исполняются на уровне компьютера пользователя. Чаще всего клиентом здесь выступает браузер, но в некоторых случаях отдельные HTML-элементы могут использоваться другими приложениями. 

Отличие сессий Flask и куки

Что касается отличий между куки и клиентскими сессиями во Flask, то они не настолько сильно выражены. Например, недостатки те же самые, что и у куки:

  1. Нет возможности хранить данные, которые не могут быть открыты посторонним лицам. То есть, если в приложении необходимо сохранить пароль пользователя, данные его банковской карты, секретное слово, которое необходимо указать, если пароль будет забыт, этого не получится сделать.
  2. Каждый запрос сопряжен с лишней нагрузкой на сервер из-за того, что приходится загружать и принимать дополнительные объемы данных. Впрочем, учитывая то, что скорости современного интернета значительно выросли в последнее время, это не повлияет на сайт с точки зрения поисковой оптимизации. 
  3. Нет возможности хранить данные, объемом больше 4 КБ.
  4. Ограничение в общем количестве куки для одного ресурса.

Тем не менее, отличие между куки и клиентскими сессиями есть. Flask гарантирует, что это содержимое будет защищено от редактирования при условии, что у пользователя отсутствует секретный ключ.

Чтобы использовать клиентские сессии во Flask, необходимо либо написать собственный интерфейс сессии, либо пользоваться специализированными расширениями. К ним относится, например, Flask-Session.

Работа с данными сессии

Чтобы работать с сессией, необходимо осуществлять ее чтение, запись и удаление части данных, которые уже не актуальны. Давайте откроем файл main2.py, чтобы добавить такой код после функции представления. 

from flask import  Flask, render_template, request, redirect, url_for, flash, make_response, session

#...

@app.route('/visits-counter/')

def visits():

    if 'visits' in session:

session['visits'] = session.get('visits') + 1  # чтение и обновление данных сессии

    else:

session['visits'] = 1  # настройка данных сессии

    return "Total visits: {}".format(session.get('visits'))




@app.route('/delete-visits/')

def delete_visits():

    session.pop('visits', None)  # удаление данных о посещениях

    return 'Visits deleted'

#...

Учтите, что объект session, по сути – это обычный словарь. 

Запустите сервер и зайдите на https://localhost:5000/visits-counter/. На странице отобразится счетчик посещений. Сессии во Flask

Для увеличения счетчика, необходимо обновить страницу несколько раз.Сессии во Flask

Отсылка куки сессии Flask осуществляется исключительно в случае, если создается новая сессия или изменяется существующая. Когда пользователь посещает страницу со счетчиком посещений впервые, то исполняется лишь блок else в функции представления. Как следствие, будет открыта сессия. Когда Flask создает новую сессию, отсылаются куки клиентскому приложению. Все запросы к этой странице, которые будут происходить после этого, приведут к выполнению инструкций, которые были в блоке if, где происходит обновление счетчика visits сессии. Когда сессия изменяется, создается новый файл куки. Следовательно, Flask отсылает новые куки сессии клиенту.

Чтобы удалить информацию, связанную с этой сессией, необходимо перейти по адресу: https://localhost:5000/delete-visits/.Сессии во Flask

Если после этого перейти к странице со счетчиком посещений, то отобразится число 1. Это означает, что сервер считает, что человек зашел впервые на этот ресурс.

Стандартные настройки следующие: куки сессии живут до того момента, как пользователь закроет окно браузера. Тем не менее, эти куки могут работать и дольше. Для этого используется атрибут permanent объекта session. Если установить ему значение True, период, в течение куки сессии будут существовать, будет равен permanent_session_lifetime

Это – атрибут datetime.timedelta объекта Flask, и его значение по умолчанию равняется 31 дню. Тем не менее, его можно изменить. Для этого необходимо присвоить новое значение указанному выше атрибуту, применяя ключ настройки PERMANENT_SESSION_LIFETIME

import datetime




app = Flask(__name__)

app.permanent_session_lifetime = datetime.timedelta(days=365)

# app.config['PERMANENT_SESSION_LIFETIME'] = datetime.timedelta(days=365)

Получить доступ к объекту sessions можно через шаблоны.

Редактирование информации, связанной с сессией

Внимание! Перед выполнением описанных ниже действий удалите установленные локальным хостом куки.

Подавляющее количество времени объект session выполняет автоматическое подхватывание изменений. Но в некоторых случаях, например, если изменяются структуры изменяемых данных, не подхватываемых автоматически, необходимо присвоить атрибуту modified (объекта session) значение True. Иначе обновленные куки клиенту показываться не будут. 

А теперь приведем код, который демонстрирует, как использовать атрибут modified объекта session. Откроем файл main2.py, чтобы добавить такой код перед функцией представления delete_visitis(). 

#...

@app.route('/session/')

def updating_session():

    res = str(session.items())




    cart_item = {'pineapples': '10', 'apples': '20', 'mangoes': '30'}

    if 'cart_item' in session:

session['cart_item']['pineapples'] = '100'

session.modified = True

    else:

session['cart_item'] = cart_item




    return res

#...

Когда пользователь впервые посещает страницу https://localhost:5000/session/, код, располагающийся в блоке else, будет исполнен. Он создаст новую сессию, где данные о ней будут представлены в виде словаря. Если осуществлять дальнейший запрос к https://localhost:5000/session/, то данные сессии обновляются. 

В следующей строке атрибуту modified передается True, так как невозможно отправление обновленных куки сессии клиенту без него. 

Необходимо запустить сервер и перейти по адресу https://localhost:5000/session/. После этого будет показан словарь с данными сессии. Но он будет пустым, поскольку браузер не имеет куки, которые могли бы отправляться серверу.Сессии во Flask

При перезагрузке страницы, в словаре session уже будет «10 ананасов».Сессии во Flask

А если выполнить еще один раз перезагрузку страницы, то увидим следующее: словарь session содержит 100 ананасов, а не 10.

Почему произошло изменение объекта сессии? Все благодаря атрибуту modified. Это проверить очень просто. Необходимо удалить куки сессии и закомментировать строчку, в которой устанавливается значение True для атрибута modified. Теперь, после того, как будет выполнен первый запрос, значение словаря сессии станет равным «10 ананасам».

Выводы

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

ОфисГуру
Adblock
detector