Skip to content

Instantly share code, notes, and snippets.

@k1000
Forked from vgarvardt/gist:1670947
Created June 17, 2012 23:10
Show Gist options
  • Save k1000/2946017 to your computer and use it in GitHub Desktop.
Save k1000/2946017 to your computer and use it in GitHub Desktop.
Tornado session decorator
# -*- coding:utf-8 -*-
import os
import functools
import pprint
import base64
import json
from datetime import datetime
from tornado import gen
def session(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
session_cookie_name = self.application.settings['session_cookie_name']
session_id = self.get_secure_cookie(session_cookie_name)
if session_id is not None:
response = yield gen.Task(self.db.sys_sessions.find_one, {'session_id': session_id})
result, error = response
if error['error'] is not None:
self.logger.error('Session read error: %s', pprint.pformat(error))
session_age = datetime.utcnow() - result[0]['updated']
if session_age.total_seconds() > self.application.settings['session_age']:
self.session = {}
else:
self.session = json.loads(base64.decodestring(result[0]['data']))
if 'user_id' in self.session:
response = yield gen.Task(self.db.auth_users.find_one, {'_id': self.session['user_id']})
result, error = response
if error['error'] is not None:
self.logger.error('User load error: %s', pprint.pformat(error))
self._user = result[0]
else:
session_id = os.urandom(32).encode('hex')
self.set_secure_cookie(session_cookie_name, session_id)
self.session = {}
method(self, *args, **kwargs)
return wrapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment