3

我正在使用 Flask 创建一个 Web 应用程序。

我想知道是否可以保存用户会话数据,例如

session['ishappy'] = true

在数据库中,就像在 Django 中使用 SessionMiddleware 一样,您可以在 cookie 和数据库之间进行选择。

如果这是我应该导入到我的 Flask 应用程序的内容。

4

3 回答 3

4

我建议您通过子类化烧瓶默认值来实现自己的 Session 和 SessionInterface。基本上,您需要定义自己的会话类和会话接口类。

class MyDatabaseSession(CallbackDict, SessionMixin):

    def __init__(self, initial=None, sid=None):
        CallbackDict.__init__(self, initial)
        self.sid = sid
        self.modified = False

上面的类现在将有一个会话 id (sid) 将存储在 cookie 中。与此会话 ID 相关的所有数据都将存储在您的 mysql 数据库中。为此,您需要实现以下类和方法:

class MyDatabaseSessionInterface(SessionInterface):

    def __init__(self, db):
        # this could be your mysql database or sqlalchemy db object
        self.db = db

    def open_session(self, app, request):
        # query your cookie for the session id
        sid = request.cookies.get(app.session_cookie_name)

        if sid:
            # Now you query the session data in your database
            # finally you will return a MyDatabaseSession object
     
    def save_session(self, app, session, response):
        # save the sesion data if exists in db
        # return a response cookie with details
        response.set_cookie(....) 

此外,您可以定义一个模型来存储会话数据:

class SessionData(db.Model):
    def __init__(self,sid,data):
        self.sid = sid
        self.data = data
        # and so on...

以下片段应该给你一个想法:

https://github.com/fengsp/flask-snippets/blob/master/sessions/redis_session.py

https://github.com/fengsp/flask-snippets/blob/master/sessions/sqlite_session.py

https://github.com/fengsp/flask-snippets/blob/master/sessions/mongodb_session.py

于 2013-07-17T14:28:14.213 回答
3

您应该查看Flask-KVSession,它自称为

Flask 签名的基于 cookie 的会话管理的替代品。不是将数据存储在客户端上,而是仅将安全生成的 ID 存储在客户端上,而实际的会话数据则驻留在服务器上。

这基本上描述了传统的服务器端会话。请注意,它支持多个数据库后端:

Flask-KVSession 使用simplekv包在各种后端存储会话数据。

有关要导入的内容以及如何配置它的示例,请参阅使用示例。

于 2013-07-17T09:07:26.377 回答
0

一位同事最近发布了这篇文章,解释了如何工作和共享用户会话。希望有帮助:

于 2014-04-17T15:51:00.570 回答