#!/usr/bin/env python3 # -*- coding: utf-8 -*- import cherrypy class PrivilegeManager(cherrypy.Tool): def __init__(self): cherrypy.Tool.__init__(self, 'before_handler', self.load, priority=10) def load(self, *args, **kwargs): sess = cherrypy.session sess.acquire_lock() _id = sess.get('id', 1337) sess['user_name'] = 'l33t' sess.save() sess.release_lock() req = cherrypy.request req.params['user_id'] = 1337 cherrypy.log(cherrypy.request.path_info) if cherrypy.request.path_info == '/a/': cherrypy.log('acquire lock ..') sess.acquire_lock() cherrypy.log('session expire ..') cherrypy.lib.sessions.expire() # cherrypy.log('session save ..') # sess.save() # cherrypy.log('release lock ..') # sess.release_lock() cherrypy.log('redirect ..') raise cherrypy.HTTPRedirect('/auth/', 307) cherrypy.log('exit ..') cherrypy.tools.privilege_manager = PrivilegeManager() class WWWRoot(object): @cherrypy.expose @cherrypy.tools.privilege_manager() def a(self, user_id): return '{0}'.format(user_id) @cherrypy.expose @cherrypy.tools.privilege_manager() def b(self, user_id): return '{0}'.format(user_id) if __name__ == '__main__': cherrypy.config.update({ 'server.socket_host': '::', 'server.socket_port': 9876, 'server.thread_pool': 64, 'server.request_queue_size': 32, }) cherrypy.tree.mount(WWWRoot(), '/', { '/': { 'tools.sessions.on': True, 'tools.sessions.name': '__session_id__', 'tools.sessions.debug': True, 'tools.sessions.storage_type': 'file', 'tools.sessions.storage_path': '/tmp', # 'tools.sessions.locking': 'explicit', 'tools.sessions.persistent': False, 'tools.sessions.httponly': True, 'tools.encode.on': True, 'tools.encode.encoding': 'utf-8', 'tools.gzip.on': True, } }) cherrypy.engine.signals.subscribe() cherrypy.engine.start() cherrypy.engine.block()