# Tornado Sessions with Redis

> Implementing session management in Tornado web framework using Redis as the session store.

- Canonical URL: https://webofmike.com/tornado-sessions-with-redis/
- Author: Mike Moore (https://webofmike.com/about/)
- Published: 2014-02-07
- Last modified: 2014-02-07
- Tags: Code, Tutorials
- Cite as: Mike Moore, "Tornado Sessions with Redis", Web of Mike (webofmike.com), 2014-02-07. https://webofmike.com/tornado-sessions-with-redis/


Tornado really doesn't have a great native session handler, so I created a custom solution combining Tornado with Redis for session management.

## Session Storage Implementation

The `RedisSessionStore` class manages backend operations:
- Initializes with configurable key prefixes and expiration times (default: 60 days)
- Generates session IDs using UUID
- Stores/retrieves pickled session data in Redis hash structures
- Automatically expires sessions based on configuration

## Session Wrapper Class

The `Session` class provides a dictionary-like interface:
- Lazy-loads session data from Redis
- Tracks modification state via a "dirty" flag
- Implements standard Python container methods (`__getitem__`, `__setitem__`, etc.)
- Records access timestamps with IP addresses
- Auto-saves changes upon deletion

## Tornado Integration

```python
class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        return self.session['user'] if self.session and 'user' in self.session else None

    @property
    def session(self):
        sessionid = self.get_secure_cookie('AUTH_COOKIE', None)
        if sessionid:
            return Session(self.application.session_store, sessionid)
        else:
            sess = Session(self.application.session_store, None)
            self.set_secure_cookie('AUTH_COOKIE', sess.sessionid)
            return sess
```

The implementation works with local Redis instances but supports remote connections through customized parameters.

