2017-09-04 19 views
0

我正试图在我的python应用程序中实现Flask-Session。我在文档中读到,推荐使用SqlAlchemySessionInterface之类的另一个界面,而不是默认的NullSessionInterface,当SESSION_TYPE配置密钥没有提供任何内容时使用。类会话下我是否需要创建一个会话表来使用Flask-Session SqlAlchemySessionInterface

从flask_session/初始化 .py文件读取

默认瓶会话将使用:类:NullSessionInterface,你 真的应该configurate您的应用程序使用不同的SessionInterface。

SESSION_TYPE配置项设置为"sqlalchemy"后,我得到一个错误

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

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

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

回答

0

研究烧瓶会议后/ 初始化根据其__init__包含瓶,SQLAlchemy的模型 class Session(self.db.Model)的.py代码,我发现,类SqlAlchemySessionInterface。 要创建此表模型,在创建我的模型的文件中,我从flask_session导入了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扩展的文档都不是很好。

相关问题