3

我正在尝试在我的 python 应用程序中实现 Flask-Session。我在文档中读到,它建议使用另一个接口,例如在没有向配置键提供任何内容时使用SqlAlchemySessionInterface的默认接口。NullSessionInterfaceSESSION_TYPE

从 Session 类下的 flask_session/ init .py 文件中读取

默认情况下 Flask-Session 将使用 :class: NullSessionInterface,您确实应该配置您的应用程序以使用不同的 SessionInterface。

SESSION_TYPE配置键设置为后"sqlalchemy"出现错误

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

这表明 Flask-Session 正在寻找在我的数据库模型中使用名称为“会话”的表,但我在 Flask-Session 文档中找不到任何地方指出应该创建一个表以及它应该具有哪些字段。

任何人都可以提出解决方案吗?

4

2 回答 2

5

我想使用 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使用新的会话表生成一个 alembic 脚本。

于 2019-04-24T12:18:08.137 回答
0

在研究了 Flask-Session/ init .py 代码后,我发现其下的 SqlAlchemySessionInterface 类__init__包含一个 Flask-SQLAlchemy 模型 class 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 Extensions 的文档都不是很好。

编辑

更改(从 flask_session 导入SqlAlchemySessionInterface)为(从 flask_sessionstore 导入SqlAlchemySessionInterface

于 2017-09-04T04:24:12.477 回答