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 表示传入cookiename对应的值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)

 

以上是关于web框架--tornado之cookie的主要内容,如果未能解决你的问题,请参考以下文章

Tornado之初学者

2Python全栈之路系列之Tornado的Cookie与Sess

web框架--tornado框架之模板引擎继承

web框架--tornado框架之初识

Tornado 用户身份验证框架

Python-----Web框架之Tornado