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

Сессии/сеансы sessions модуля flask в Python

Передача информации от одного запроса к другому во Flask

Если установлен атрибут экземпляра приложения Flask.secret_key или настроен параметр конфигурации SECRET_KEY, то можно использовать сессии/сеансы в приложениях Flask. Сессия/сеанс Flask позволяет запоминать информацию от одного запроса к другому. Фреймворк Flask делает это с помощью подписанного файла cookie. Пользователь может просматривать содержимое сессии/сеанса, но не может изменять его, если не знает секретный ключ, поэтому обязательно установите для него что-то сложное. Один из способов создать такой ключ, это воспользоваться следующей командой модуля os:

>>> import os
>>> os.urandom(30).hex()

Для доступа к текущей сессии/сеансу можно использовать прокси объект сессии/сеанса flask.session, который дает доступ к объекту flask.Session:

Синтаксис:

>>> import flask
>>> flask.session
# <LocalProxy unbound>

Параметры:

  • нет.

Возвращаемое значение:

Описание:

Прокси объект session представляет собой объект сессии/сеанса, который работает почти так же, как обычный словарь Python, с той лишь разницей, что отслеживает изменения. Прокси объект session (содержащий словарь с переменными сессии) доступен как в контексте приложения, так и в контексте шаблонах.

Интересны следующие атрибуты и методы объекта Session:

session.new:

Атрибут сессии/сеанса session.new имеет значение True, если сессия - новая, в противном случае значение False.

session.modified:

Атрибут сессии/сеанса session.modified отвечает за передачу измененных переменных сессии от запроса к запросу. Будет иметь значение True, если объект сессии Session обнаружил изменение переменной автоматически.

Объект Session, автоматически обнаруживает модификацию переменных, только если они имеют значения НЕизменяемых типов Python.

Важная особенность! Модификация изменяемых объектов Python (таких как списки и т.д.) автоматически не обнаруживается объектом Session и следовательно измененное значение не будет передаваться от запроса к запросу. В этой ситуации, необходимо явно установить значение True для атрибута Session.modified.

Пример работы с изменяемыми типами в сессии:

Предположим, что для каких-то целей, в сессии приложения Flask, необходима переменная session['data'], которая имеет тип list.

# при первом запросе пользователя
# устанавливаем пустой список, как 
# одну из переменных сессии
session['data'] = []
# при втором запросе к сайту, делаем  
# следующее изменение
session['data'].append(8)

Так вот, это изменение списка автоматически не обнаружиться Session (т.к. список - это изменяемый объект) и при следующим запросе пользователя к сайту, переменная session['data'] не поменяется и останется пустым списком []! Для того, что бы такие изменения передавались от запроса к запросу необходимо вручную устанавливать session.modified=True.

Это можно исправить следующим образом:

session['data'].append(8)
# модификацию изменяемых объектов Python
# необходимо отслеживать самостоятельно 
if not session.modified:
    session.modified = True

Session.permanent:

Атрибут сессии/сеанса Session.permanent отвечает за время жизни сессии/сеанса. Если установлено значение True, то сессия/сеанс существует в течение app.permanent_session_lifetime секунд. По умолчанию 31 день. Если установлено значение False (по умолчанию), то сессия/сеанс будет удалена, когда пользователь закроет браузер.

Примечание: время жизни устанавливается для объекта сессии/сеанса, а не для конкретного ключа сессии/сеанса.

Session.get(key, default=None):

Метод Session.get() возвращает значение для ключа сессии/сеанса key (если он есть), иначе возвращается значение по умолчанию default.

Session.pop(key, default):

Метод Session.pop() удаляет указанный ключ сессии/сеанса key и возвращает соответствующее значение. Если ключ key не найден, то возвращается значение по умолчанию default, если оно задано. В противном случае вызывается исключение KeyError.

def logout():
    # удаляем имя пользователя из сеанса, если оно есть
    session.pop('username', None)
    return redirect(url_for('index'))

Session.clear():

Метод Session.clear() удаляет все установленные ключи из словароподобного объекта сессии/сеанса. Другими словами - очищает сессию пользователя.

def logout():
    # удаляем сеанс
    session.clear()
    return redirect(url_for('index'))

Примеры работы с сессиями в приложении Flask.

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

from flask import session

# установим секретный ключ для подписи. Держите это в секрете!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return f'Вошел как {session["username"]}'
    return 'Вы не авторизованы'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # устанавливаем сессию для пользователя
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # удаляем имя пользователя из сеанса, если оно есть
    session.pop('username', None)
    return redirect(url_for('index'))