梦想一步登天

导航

web框架--tornado之cookie与session初识

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)

 

posted on 2019-12-15 21:19  梦想一步登天  阅读(416)  评论(0编辑  收藏  举报