zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    数据库范式
    java String.split()用法
    1.4 IoC控制反转
    利用shrinkwrap锁定依赖版本
    清晨开启电脑自动拉取项目更新
    JS如何获取屏幕、浏览器及网页高度宽度?
    Navigator 对象,能够清楚地知道浏览器的相关信息
    iconfont 转换为图标字体
    VS code的搜索、替换与正则替换
    点九图制作方法
  • 原文地址:https://www.cnblogs.com/june-L/p/12046010.html
Copyright © 2011-2022 走看看