Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

django - Flask - Save session data in database like using cookies

I am creating a web app using Flask.

I wonder if it is possible to save user session data like

session['ishappy'] = true

in database like it's done in Django using SessionMiddleware where you have options to choose between cookies and database.

And if it is what should I import to my Flask app.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I suggest you implement your own Session and SessionInterface by subclassing flask defaults. Basically, you need to define your own session class and a session interface class.

class MyDatabaseSession(CallbackDict, SessionMixin):

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

The above class will now have a session id (sid) that will be stored in the cookie. All the data related to this session id will be stored in your mysql database. For that, you need to implement the following class and methods below:

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(....) 

Also, you can define a model for storing session data:

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

The following snippets should give you an idea:

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...