简单的说
- Cookie是保存在浏览器的键值对
- Session是保存在服务端的键值对
- Session是依赖于Cookie的
在Django框架中,我们可以直接操作cookie和session,但是tornado只支持cookie,那如果要使用session怎么办呢?自己定义session
基于内存实现SESSION
我们知道,在tornado中,所有的请求都是由RequestHandler对象来处理(以下简称handler对象)。在RequestHandler源码中,预留了一个钩子方法initialize,该方法会在实例化Handler对象时执行。因此,如果我们继承RequestHandler类并重写initialize,就可以完成一些自定义操作。
import os import tornado.ioloop import tornado.web from tornado.web import RequestHandler import hashlib import time # 生成一个随机的字符串def gen_random_str(): md5 = hashlib.md5() md5.update(str(time.time()).encode('utf-8')) return md5.hexdigest() class CacheSession(object): container = {} def __init__(self,handler): self.handler = handler client_random_str = self.handler.get_cookie("_session_id_") if client_random_str and client_random_str in self.container: self.random_str = client_random_str else: self.random_str = gen_random_str() self.container[self.random_str] = {} expires = time.time() + 300 self.handler.set_cookie("_session_id_", self.random_str, expires=expires) def __setitem__(self, key, value): self.container[self.random_str][key] = value def __getitem__(self, item): return self.container[self.random_str].get(item) class SessionHandler(RequestHandler): def initialize(self): # self指代的是当前的对象 self.session = CacheSession(self) class LoginHandler(SessionHandler,RequestHandler): def get(self, *args, **kwargs): self.render('login.html') def post(self, *args, **kwargs): username = self.get_argument('username') password = self.get_argument('password')

