# -*- 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