web框架--tornado之cookie
Posted 梦想一步登天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web框架--tornado之cookie相关的知识,希望对你有一定的参考价值。
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(); }
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)
以上是关于web框架--tornado之cookie的主要内容,如果未能解决你的问题,请参考以下文章