cookie
的本质其实就是在浏览器端保存的键值对, 每当浏览器端发送一次请求, 都会将这些键值对附加在请求中并发送给服务器端。
一、目录结构
二、main_pro.py
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import tornado.ioloop 5 import tornado.web 6 7 8 class IndexHandler(tornado.web.RequestHandler): 9 def get(self, *args, **kwargs): 10 # self.write("Hello, world") 11 t = self.get_cookie('auth') 12 if t == '1': 13 self.render('index.html') 14 else: 15 self.redirect('/login') 16 17 class LogoutHandler(tornado.web.RequestHandler): 18 def get(self, *args, **kwargs): 19 # self.write("Hello, world") 20 self.set_cookie('auth', '0') #退出登录,将cookie信息清空 21 self.redirect('/login') 22 23 24 class LoginHandler(tornado.web.RequestHandler): 25 def get(self, *args, **kwargs): 26 # self.write("Hello, world") 27 self.render('login.html', status_text='') 28 29 30 def post(self, *args, **kwargs): 31 username = self.get_argument('username', None) 32 pwd = self.get_argument('password', None) 33 if username == 'yusheng_liang' and pwd == 'adm': 34 self.set_cookie('auth', '1') #登录谁成功,设置cookie信息 35 self.redirect('/index') 36 else: 37 self.render('login.html', status_text='登录失败') 38 settings = { 39 'template_path': 'views', #视图模板路径 40 'static_path': 'static', #静态文件路径 41 } 42 43 #路由映射,路由系统 44 def make_app(): 45 return tornado.web.Application([ 46 (r"/login", LoginHandler), 47 (r"/index", IndexHandler), 48 (r"/logout", LogoutHandler), 49 ], **settings) 50 51 if __name__ == "__main__": 52 app = make_app() 53 app.listen(8888) 54 tornado.ioloop.IOLoop.current().start()
1)self.set_cookie('name', 'test')
设置未加密的cookie
, 键为'name', 值为test
2)self.set_secure_cookie('user', 'test')
设置加密cookie
, 键为'user', 值为test
. 设置加密cookie
我们需要在配置中添加自定义的加密串(俗称对加密结果加盐)"cookie_secret": 'test-secret,'
3)name = self.get_cookie('name', None)
获取指定key
未加密的cookie
的值
4)user = self.get_cookie('user', None)
获取指定key
的加密后的cookie
的值
5)对于set_cookie()
和set_secure_cookie()
都用以下常见参数value
表示传入cookie
的name
对应的值name
表示传入cookie
的键
6)domain=None
表示域名
7)expires=None
设置过期时间, 这里单位为秒
path="/"
表示当前的cookie
在那些路径下有效, /
表示当前域名下所有的路径均有效
expires_days=None
设置过期时间, 单位为天
自定义一个set_secure_cookie
1 import tornado.ioloop 2 import tornado.web 3 4 class BaseHandler(tornado.web.RequestHandler): 5 6 def get_current_user(self): 7 return self.get_secure_cookie("login_user") 8 9 class MainHandler(BaseHandler): 10 11 @tornado.web.authenticated 12 def get(self): 13 login_user = self.current_user 14 self.write(login_user) 15 16 class LoginHandler(tornado.web.RequestHandler): 17 def get(self): 18 self.current_user() 19 20 self.render('login.html', **{'status': ''}) 21 22 def post(self, *args, **kwargs): 23 24 username = self.get_argument('name') 25 password = self.get_argument('pwd') 26 if username == 'admin' and password == '123': 27 self.set_secure_cookie('login_user', 'admin') 28 self.redirect('/') 29 else: 30 self.render('login.html', **{'status': '用户名或密码错误'}) 31 32 settings = { 33 'template_path': 'template', 34 'static_path': 'static', 35 } 36 37 application = tornado.web.Application([ 38 (r"/index", MainHandler), 39 (r"/login", LoginHandler), 40 ], **settings) 41 42 43 if __name__ == "__main__": 44 application.listen(8888) 45 tornado.ioloop.IOLoop.instance().start()
三、JavaScript操作Cookie
由于Cookie保存在浏览器端,所以在浏览器端也可以使用JavaScript来操作Cookie。
/* 设置cookie,指定秒数过期, name表示传入的key, value表示传入相对应的value值, expires表示当前日期在加5秒过期 */ function setCookie(name,value,expires){ var temp = []; var current_date = new Date(); current_date.setSeconds(current_date.getSeconds() + 5); document.cookie = name + "= "+ value +";expires=" + current_date.toUTCString(); }
四、自定义一个session验证
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import tornado.web 4 import tornado.ioloop 5 6 container = {} 7 class Session: 8 def __init__(self, handler): 9 self.handler = handler 10 self.random_str = None 11 12 def __genarate_random_str(self): 13 import hashlib 14 import time 15 obj = hashlib.md5() 16 obj.update(bytes(str(time.time()), encoding='utf-8')) 17 random_str = obj.hexdigest() 18 return random_str 19 20 def __setitem__(self, key, value): 21 # 在container中加入随机字符串 22 # 定义专属于自己的数据 23 # 在客户端中写入随机字符串 24 # 判断,请求的用户是否已有随机字符串 25 if not self.random_str: 26 random_str = self.handler.get_cookie('__session__') 27 if not random_str: 28 random_str = self.__genarate_random_str() 29 container[random_str] = {} 30 else: 31 # 客户端有随机字符串 32 if random_str in container.keys(): 33 pass 34 else: 35 random_str = self.__genarate_random_str() 36 container[random_str] = {} 37 self.random_str = random_str # self.random_str = asdfasdfasdfasdf 38 39 container[self.random_str][key] = value 40 self.handler.set_cookie("__session__", self.random_str) 41 42 def __getitem__(self, key): 43 # 获取客户端的随机字符串 44 # 从container中获取专属于我的数据 45 # 专属信息【key】 46 random_str = self.handler.get_cookie("__session__") 47 if not random_str: 48 return None 49 # 客户端有随机字符串 50 user_info_dict = container.get(random_str,None) 51 if not user_info_dict: 52 return None 53 value = user_info_dict.get(key, None) 54 return value 55 56 57 class BaseHandler(tornado.web.RequestHandler): 58 def initialize(self): 59 self.session = Session(self)