Если установлен атрибут экземпляра приложения 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>
dict
и имеет дополнительные свойства и методы.Прокси объект 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'))
Чтобы использовать сессии/сеансы, необходимо установить секретный ключ, при помощи которого будут подписываться сессионные 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'))