CherryPy_ kicks some serious arse in the 'I am just a HTTP framework' category! As of version 3.2 it supports 4 types of storage for sessions by default:
Redis is growing in popularity as an alternative to Memcached (and is fully supported on dotCloud_!)
If you are not using pip yet. Install it and while you are at it consider using virtualenv too.
::
$ pip install cherrys
redis-py and CherryPy are required dependencies hence will be installed if necessary.
We recommend installing hiredis-py_ (a faster parser) as well.
::
$ pip install hiredis
To tell CherryPy_ which backend to use, we need to specify the storage_type for the sessions tool. You may want to read more about CherryPy configuration.
::
tools.sessions.storage_type : 'redis'
But CherryPy doesn't know Redis. Hence the first thing we need to do is add the cherrys RedisSession class to cherrypy.lib.sessions.
::
import cherrys
cherrypy.lib.sessions.RedisSession = cherrys.RedisSession
It is that simple!
There are a few optional parameters you can set:
Sentinel-related additional (optional) parameters:
A full config dictionary to activate Redis_ backed sessions would look like this.
::
config = {
'tools.sessions.on' : True,
'tools.sessions.storage_type' : 'redis',
'tools.sessions.host': REDIS_HOST,
'tools.sessions.port': REDIS_PORT,
'tools.sessions.db': REDIS_DB,
'tools.sessions.prefix': REDIS_PREFIX,
'tools.sessions.user': REDIS_USER,
'tools.sessions.password': REDIS_PASS,
'tools.sessions.lock_timeout: LOCK_TIME_SECONDS,
}
A full config dictionary to activate RedisSentinelSSL_ backed sessions would look like this.
::
config = {
'tools.sessions.on' : True,
'tools.sessions.storage_type' : 'redis',
'tools.sessions.host': REDIS_HOST,
'tools.sessions.port': REDIS_PORT,
'tools.sessions.ssl': True,
'tools.sessions.db': REDIS_DB,
'tools.sessions.prefix': REDIS_PREFIX,
'tools.sessions.user': REDIS_USER,
'tools.sessions.password': REDIS_PASS,
'tools.sessions.lock_timeout: LOCK_TIME_SECONDS,
'tools.sessions.is_sentinel': True,
'tools.sessions.sentinel_pass': REDIS_SENTINEL_PASS,
'tools.sessions.sentinel_service': REDIS_SENTINEL_SERVICENAME,
'tools.sessions.tls_skip_verify': True,
}
As a shortcut a URL to the redis server can be provided as well.
::
import cherrys
config = {
'tools.sessions.on' : True,
# next setting removes the need for initializing `cherrypy.lib.sessions.RedisSession' above:
'tools.sessions.storage_class' : cherrys.RedisSession,
'tools.sessions.url': 'redis://your-name:your-pwd@redis-server:6379/2'
}
The number at the end of the URL ("2") denotes the redis database to be used.
Unittests require a running redis-server on localhost:6379 setup without any authentication in place.
Then install pytest into your current virtualenv and start it from your command line:
::
$ pip install pytest
$ pytest
.. _CherryPy: http://www.cherrypy.dev .. _PostgreSQL: http://www.postgresql.org .. _Memcached: http://memcached.org .. _Redis: http://redis.io .. _dotCloud: http://www.dotcloud.com .. _pip: http://pip-installer.org .. _virtualenv: http://www.virtualenv.org .. _redis-py: https://github.com/andymccurdy/redis-py .. _hiredis-py: https://github.com/pietern/hiredis-py .. _configuration: http://docs.cherrypy.org/stable/concepts/config.html .. _RedisSentinelSSL: https://redis.io/topics/sentinel