Нужно ли создавать таблицу сессий для использования Flask-Session SqlAlchemySessionInterface

Я пытаюсь реализовать Flask-Session в моем приложении на Python. Я прочитал в документации, что рекомендуется использовать другой интерфейс, такой как SqlAlchemySessionInterface вместо по умолчанию NullSessionInterface который используется, когда ничего не предоставляется SESSION_TYPE ключ конфигурации

Из файла flask_session /init.py в классе Session он читает

По умолчанию Flask-Session будет использовать:class:NullSessionInterfaceВы действительно должны настроить свое приложение для использования другого SessionInterface.

После настройки SESSION_TYPE ключ конфигурации для "sqlalchemy" Я получаю ошибку

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "sessions" does not exist

Это указывает на то, что Flask-Session ищет в моей модели базы данных таблицу с именем "session", но я не могу найти нигде в документации Flask-Session, где указано, что таблица должна быть создана и какие поля у нее должны быть.

Может кто-нибудь предложить решение этой проблемы, пожалуйста?

1 ответ

Я хотел использовать Flask-session, но я также использовал Flask-migrate и не хотел вручную вызывать db.create_all() и нарушать путь миграции. К счастью, предложение @Flashspeedlife просто импортировать интерфейс и создать его экземпляр сработало.

приложение /__init__.py:

from flask_session import SqlAlchemySessionInterface
from app.extensions import db, sess, migrate # My extensions file

def create_app():
    app = Flask(__name__)
    with app.app_context():
         db.init_app(app)
         migrate.init_app(app, db)

         sess.init_app(app)
         SqlAlchemySessionInterface(app, db, "sessions", "sess_")

Сейчас, flask db migrate генерирует алембический скрипт с новой таблицей сеансов.

Изучив код Flask-Session /init.py, я обнаружил, что класс SqlAlchemySessionInterface под его __init__ содержит модель Flask-SQLAlchemyclass Session(self.db.Model), Чтобы создать эту модель таблицы, в файле, где я создаю свои модели, я импортировал SqlAlchemySessionInterface от flask_sessionstore и поставить линиюSqlAlchemySessionInterface(myApp, sqlAlchemyDbObject, "table_name", "prefix_")и затем запустил db.create_all().

class SqlAlchemySessionInterface(SessionInterface):
"""Uses the Flask-SQLAlchemy from a flask app as a session backend.

.. versionadded:: 0.2

:param app: A Flask app instance.
:param db: A Flask-SQLAlchemy instance.
:param table: The table name you want to use.
:param key_prefix: A prefix that is added to all store keys.
:param use_signer: Whether to sign the session id cookie or not.
:param permanent: Whether to use permanent session or not.
"""

serializer = pickle
session_class = SqlAlchemySession

def __init__(self, app, db, table, key_prefix, use_signer=False,
             permanent=True):
    if db is None:
        from flask_sqlalchemy import SQLAlchemy
        db = SQLAlchemy(app)
    self.db = db
    self.key_prefix = key_prefix
    self.use_signer = use_signer
    self.permanent = permanent

    class Session(self.db.Model):
        __tablename__ = table

        id = self.db.Column(self.db.Integer, primary_key=True)
        session_id = self.db.Column(self.db.String(255), unique=True)
        data = self.db.Column(self.db.LargeBinary)
        expiry = self.db.Column(self.db.DateTime)

        def __init__(self, session_id, data, expiry):
            self.session_id = session_id
            self.data = data
            self.expiry = expiry

        def __repr__(self):
            return '<Session data %s>' % self.data

    # self.db.create_all()
    self.sql_session_model = Session

Я определенно использую Django для моего следующего проекта. Документация для многих расширений Flask совсем не велика.

РЕДАКТИРОВАТЬ

Изменено (импортировано SqlAlchemySessionInterface из flask_session) в (импортировано SqlAlchemySessionInterface из flask_sessionstore)

Другие вопросы по тегам