Andrew Kloos
Andrew Kloos

Reputation: 4598

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

Upvotes: 0

Views: 675

Answers (1)

laurasia
laurasia

Reputation: 686

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.

Upvotes: 3

Related Questions