【问题标题】:Do I need to create a sessions table to use Flask-Session SqlAlchemySessionInterface我是否需要创建会话表才能使用 Flask-Session SqlAlchemySessionInterface
【发布时间】:2017-09-04 02:01:54
【问题描述】:

我正在尝试在我的 python 应用程序中实现 Flask-Session。我在文档中读到,它建议使用另一个接口,如SqlAlchemySessionInterface,而不是默认的NullSessionInterface,后者在SESSION_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 文档中找不到任何地方指出应该创建一个表以及它的哪些字段应该有。

有人可以提出解决方案吗?

【问题讨论】:

  • 你解决了这个问题吗?我找不到任何解决方案...我创建了表格,但仍然出现错误。看起来问题出在模式中,但我无法在不更改库代码的情况下为 Session 模型声明它。在 PG 中将 search_path 设置为正确的模式,但它没有帮助...
  • @JeffersonH​​oup 我能够解决我的问题,并且我在这个线程的答案中描述了我是如何解决它的。最后,虽然我将我的项目移植到了 Django。再也不要因为任何严重的事情而接触 Flask。

标签: python python-3.x flask-sqlalchemy flask-session


【解决方案1】:

我想使用 Flask-session,但我也在使用 Flask-migrate,不想手动调用 db.create_all() 并破坏迁移路径。幸运的是,@Flashspeedlife 建议只导入接口并实例化它。

app/__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 脚本。

【讨论】:

    【解决方案2】:

    在研究了 Flask-Session/init.py 代码后,我发现其__init__ 下的 SqlAlchemySessionInterface 类包含一个 Flask-SQLAlchemy 模型 class Session(self.db.Model)。 为了创建这个表模型,在我创建模型的文件中,我从 flask_sessionstore 导入了 SqlAlchemySessionInterface 并将行 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 扩展的文档都不是很好。

    编辑

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

    【讨论】:

    • 你把SqlAlchemySessionInterface(myApp, sqlAlchemyDbObject, "table_name", "prefix_")这行放在哪里了?我是否正确理解您不需要为table_name 创建新模型?
    • @Lewistrick 我把那行放在models.py 文件中。是的,你确实不需要需要自己创建模型。从flask_sessionstore 导入SqlAlchemySessionInterface 并调用SqlAlchemySessionInterface() 将自动创建session 表。我使用的确切行是SqlAlchemySessionInterface(app, db, "session", "sess_")
    猜你喜欢
    • 1970-01-01
    • 2018-02-03
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多