Search code examples
mysqlsessioncherrypy

How to store web sessions in MySQL for CherryPy 3.2.2?


I found many examples for older versions of CherryPy but they each referenced importing modules not found in cherrypy 3.2.2. Looking in the documentation, I found a reference to the fact that there is built in functionality with storage_type (one of ‘ram’, ‘file’, ‘postgresql’).


Solution

  • For a start you could take a look at

    https://github.com/3kwa/cherrys

    how this guy writes his own session class and overwrites some methods. He does it for redis not MySQL. You would write methods for MySQL. A very similar class already exists in cherrypy in "cherrpy/lib/sessions.py":

    class PostgresqlSession(Session)
    

    which is very similar to what you want. I'd say, take the implementing approach from the "3kwa" but instead of his RedisSession-class copy the PostgresqlSession-class from "cherrpy/lib/sessions.py" and alter to match proper MySQL-Syntax.

    A possible path could be:

    Download the "cherrys.py" from above link and rename into "mysqlsession.py". Overwrite the "RedisSessions(Session)" with the "PostgresqlSession(Session)" from "cherrpy/lib/sessions.py" and rename to "MySQLSession(Session)". Be sure to add

    locks = {}
    
    def acquire_lock(self):
        """Acquire an exclusive lock on the currently-loaded session data."""
        self.locked = True
        self.locks.setdefault(self.id, threading.RLock()).acquire()
    
    def release_lock(self):
        """Release the lock on the currently-loaded session data."""
        self.locks[self.id].release()
        self.locked = False
    

    to your new "MySQLSession"-class (like it is done in RedisSession(Session). Alter the the PostgreSQL-Syntax to match MySQL-Syntax (that shouldn't be difficult). Put the "mysqlsession.py" somewhere below your project directory and import in the application with

    import mysqlsession
    

    and use

    cherrypy.lib.sessions.MySQLSession = mysqlsession.MySQLSession
    

    in the initialization of you app. In the config

    tools.sessions.storage_type : 'mysql'
    

    and the parameters (like host, port, etc.) like you would with class "PostgreSQL".

    I can be wrong all along. But this is how I would try to solve this.