Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Redis/Memcached sessions for Tornado
Python
tree: 5613e216e5

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
pycket.egg-info
pycket
tests
.gitignore
LICENSE
README.markdown
requirements
setup.cfg
setup.py

README.markdown

pycket

This is a session library, written for use with Redis and Tornado web server.

License

This software is under BSD 2-Clause License (see LICENSE file)

Requirements

Non-Python requirements:

  • Redis (tested with version 2.4.0)

Python requirements (included in setup script)

  • Tornado (tested with 2.1.1, installable via "tornado" package in PyPI)
  • redis-py (tested with 2.4.9, installable via "redis" package in PyPI)

Development requirements

If you wish to contribute to the project as a developer, just install the requirements file included in the project with pip.

Examples

You have two ways of using pycket sessions in your application.

The easier way is including the appropriate mixin(s) in the handler's inheritance list, and the "session" member will become available:

from pycket.session import SessionMixin


class MyHandler(tornado.web.RequestHandler, SessionMixin):
    def get(self):
        self.session.set('foo', ['bar', 'baz'])
        foo = self.session.get('foo') # will get back the list ['bar', 'baz']

The other way (harder, but less coupled) is to instantiate a SessionManager and passing the handler instance to the initializer:

from pycket.session import SessionManager


class MyHandler(tornado.web.RequestHandler):
    def get(self):
        session = SessionManager(self)
        session.set('foo', ['bar', 'baz'])
        foo = session.get('foo') # will get back the list ['bar', 'baz']

For both examples above the session instance is a SessionManager.

SessionManager instances act as a dictionary, so they can retrieve values with a default alternative, like:

session.get("this doesn't exist", "so give me this instead")

and they can also get and set values with square-brackets, like:

session['gimme'] = 'Fire!'
print session['gimme'] # 'Fire!'

Settings

pycket understands two types of settings, which must be items in the application's settings:

  1. "pycket_redis": this is a dictionary containing any items that should be repassed to the redis.Redis instance to be used in the session manager (such as "host" and "port"); Notice, however, that if you want to change the dataset numbers to be used for sessions and notifications, use "db_sessions" and "db_notifications", respectively, instead of "db" (they will be converted to the "db" parameter that is passed to the Redis client for each manager afterwards);
  2. "pycket_cookies": this is a dictionary containing all settings to be repassed to the RequestHandler.set_secure_cookie. If they don't contain "expires" or "expires_days" items, they will be set as None, which means that the default behaviour for the sessions is to last on browser session. (And deleted as soon as the user closes the browser.) Notice that the sessions in the database last for one day, though.

Example:

application = tornado.web.Application([
    (r'/', MainHandler),
], **{
    'pycket_redis': {
        'host': 'localhost',
        'port': 6379,
        'db_sessions': 10,
        'db_notifications': 11,
    }
    'pycket_cookies': {
        'expires_days': 120,
    }
)

The default dataset numbers for sessions and notifications are, respectively, 0 and 1.

Notifications

This feature is almost equal to the sessions, but slightly different:

  • They have to be used via pycket.notification.NotificationMixin or pycket.notification.NotificationManager;
  • The values persisted with them can be retrieved only once, and after this are immediately deleted from the dataset;
  • The default dataset used is 1, instead of 0, to avoid conflicts with normal sessions.

Author

This module was developed by Diogo Baeder (*/diogobaeder), who is an absolute Python lover, and is currently in love with event-driven programming and ArchLinux.

Something went wrong with that request. Please try again.