会话数据库关闭时,回退到Flask的默认会话管理器?

时间:2016-02-25 03:35:35

标签: python flask

我正在使用SqlAlchemy作为会话管理数据库,并根据文档创建了自定义SessionInterface

我的开发人员数据库今天关闭了,现在我无法访问我的网站,正如预期的那样。在这次活动中,有没有办法让我回到Flask的默认会话管理器?

以下是我SessionInterface

的当前实现
class SqlAlchemySessionInterface(SessionInterface):
    #...
    def open_session(self, app, request):
        sid = request.cookies.get(app.session_cookie_name)
        if sid:
            # error is raised here when database is down
            stored_session = DBSession.query.filter_by(sid=sid).first()
            # ...

我对崩溃的数据库问题有一个天真的解决方案,它利用内存中的dict作为备份:

# A backup memory storage for sessions
backup = {}
class SqlAlchemySessionInterface(SessionInterface):
    #...
    def open_session(self, app, request):
        sid = request.cookies.get(app.session_cookie_name)
        if sid:
            try:
                stored_session = DBSession.query.filter_by(sid=sid).first()
            except DatabaseError:
                stored_session = backup.get('sid')
                # ...

1 个答案:

答案 0 :(得分:0)

您可以扩展默认的secure cookie会话接口实现。

class ReliableSessionInterface(SecureCookieSessionInterface):
    def open_session(self, app, request):
        try:
            return self._open_db_session(app, request)
        except DatabaseError:
            return super().open_session(app, request)

    def save_session(app, session, response):
        try:
            self._save_session_to_db(app, session, response)
        except DatabaseError:
            super().save_session(app, session, response)

然而,这样的要求听起来有点奇怪。