在tornado中,所有的请求都是由RequestHandler对象来处理(以下简称handler对象)。在RequestHandler源码中,预留了一个钩子方法initialize,该方法会在实例化Handler对象时执行。因此,如果我们继承RequestHandler类并重写initialize,就可以完成一些自定义操作。
- 定义一个Session类,其实例化时接收handler对象
- 在Session类中定义一个静态字段(大字典),用来存储session_id和对应的用户信息;所有的session对象都可以访问这个大字典。
- 在Session的构造方法中,获取和设置cookie:
- 调用handler对象get_cookie()方法获取session_id,如果没有,则生成一段随机字符串random_str作为session_id
- 将session_id写入大字典
- 调用handler对象的set_cookie()方法,通知浏览器设置cookie:set-cookie: {session_id: random_str}
- 在Session类中,定义getitem, setitem, delitem方法来实现通过字典的方式操作session对象(面向对象内置方法参考这里)
- 在initialize方法中为handler对象增加session属性,其值是Session对象:self.session=Session(self);在每个路由对应的视图中都重写initialize方法太麻烦了,利用面向对象的多继承,将这一步单独写在一个类SessionHandler,所以视图类先继承这个类即可。
- 每次请求进来,都会执行SessionHandler中的initialize方法,并实例化Session对象,从而获取session_id
- 操作session:
- 通过self.session[key] = value 即可调用session对象的setitem方法来写session;
- 通过self.session[key] 即可调用session对象的getitem方法来获取session
- 通过del self.session[key] 即可调用session对象的delitem方法来删除session
- 通过self.session.delete(),即可调用session对象的delete方法,删除整个session_id
1 | import tornado.ioloop |
转载Ayhan_huang博客http://blog.csdn.net/ayhan_huang/article/details/78731783