我正在尝试在我的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希望在我的数据库模型中使用名为“sessions”的表,但我在Flask-Session文档中找不到任何地方,它指出应该创建一个表以及它在哪个字段中应该有。
有人可以建议解决这个问题吗?
答案 0 :(得分:0)
在研究了Flask-Session / init .py代码之后,我发现其__init__
下的类SqlAlchemySessionInterface包含一个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)
答案 1 :(得分:0)
我想使用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脚本。