zoukankan      html  css  js  c++  java
  • 第二百六十九节,Tornado框架-Session登录判断

    Tornado框架-Session登录判断

    Session需要结合cookie来实现

    Session的理解

      1、用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串

      2、将密串作为一个字典的键,值为一个字典,也就是嵌套字典,键为密串的字典里保存用户信息

      3、将这个密串当做cookie值写入浏览器

      4、当用户访问时,判断值为密串的cookie是否存在,如果存在,获取cookie的值也就是密串,将这个密串在服务端的字典里查找是否存在,如果存在就可以拿到用户保存的各种信息,判断用户是否是登录状态

    框架引擎

    #!/usr/bin/env python
    #coding:utf-8
    
    import tornado.ioloop
    import tornado.web                              #导入tornado模块下的web文件
    
    
    container = {}                                  #用户登录信息字典,保存着用户的登录信息,{'328eb994f73b89c5f1de57742be1ee82': {'is_login': True, 'mim': 'admin', 'yhm': 'admin'}}
    
    class indexHandler(tornado.web.RequestHandler):  #定义一个类,继承tornado.web下的RequestHandler类
        def get(self):                                              #get()方法,接收get方式请求
            hq_cookie = self.get_cookie('xr_cookie')                #获取浏览器cookie
            session = container.get(hq_cookie,None)                 #将获取到的cookie值作为下标,在数据字典里找到对应的用户信息字典
            if not session:                                         #判断用户信息不存在
                self.redirect("/dlu")  # 显示登录html文件            #跳转到登录页面
            else:
                if session.get('is_login',None) == True:            #否则判断用户信息字典里的下标is_login是否等于True
                    self.render("index.html")  # 显示index.html文件  #显示查看页面
                else:
                    self.redirect("/dlu")                           #跳转登录页面
    
    class dluHandler(tornado.web.RequestHandler):
        def get(self):
            hq_cookie = self.get_cookie('xr_cookie')                #获取浏览器cookie
            session = container.get(hq_cookie,None)                 #将获取到的cookie值作为下标,在数据字典里找到对应的用户信息字典
            if not session:                                         #判断用户信息不存在
                self.render("dlu.html")  # 显示登录html文件          #打开到登录页面
            else:
                if session.get('is_login',None) == True:            #否则判断用户信息字典里的下标is_login是否等于True
                    self.redirect("/index")  # 显示index.html文件    #跳转查看页面
                else:
                    self.redirect("/dlu")                           #跳转登录页面
    
        def post(self):
            yhm = self.get_argument('yhm')                          #接收用户输入的登录账号
            mim = self.get_argument('mim')                          #接收用户输入的登录密码
            if yhm == 'admin' and mim == 'admin':                   #判断用户的密码和账号
                import hashlib                                      #导入md5加密模块
                import time                                         #导入时间模块
                obj = hashlib.md5()                                 #创建md5加密对象
                obj.update(bytes(str(time.time()),encoding = "utf-8"))  #获取系统当前时间,传入到md5加密对象里加密
                suijishu = obj.hexdigest()                              #获取加密后的密串
                container[suijishu] = {}                                #将密串作为下标到container字典里,创建一个新空字典
                container[suijishu]['yhm'] = yhm                        #字典里的键为yhm,值为用户名
                container[suijishu]['mim'] = mim                        #字典里的键为mim,值为用户密码
                container[suijishu]['is_login'] = True                  #字典里的键为is_login,值为True
                self.set_cookie('xr_cookie',suijishu,expires_days=1)    #将密串作为cookie值写入浏览器
                self.redirect("/index")                                 #跳转到查看页面
            else:
                self.redirect("/dlu")
    
    settings = {                                        #html文件归类配置,设置一个字典
        "template_path":"views",                     #键为template_path固定的,值为要存放HTML的文件夹名称
        "static_path":"statics",                         #键为static_path固定的,值为要存放js和css的文件夹名称
        "cookie_secret":"61oETzKXQAGaYdkL5gEmGeJJY",
    }
    
    #路由映射
    application = tornado.web.Application([         #创建一个变量等于tornado.web下的Application方法
        (r"/index", indexHandler),                   #判断用户请求路径后缀是否匹配字符串index,如果匹配执行MainHandler方法
        (r"/dlu", dluHandler),
    ],**settings)                                   #将html文件归类配置字典,写在路由映射的第二个参数里
    
    if __name__ == "__main__":
        #内部socket运行起来
        application.listen(8888)                    #设置端口
        tornado.ioloop.IOLoop.instance().start()

    Session模块封装以及使用

    Session(self,1) 创建session对象,参数1接收接收tornado.web.RequestHandler的self对象,也就是继承RequestHandler对象,参数2cookie过期时间
    session['yhm']=yhm 自定义用户保存数据,保存在字典里['键']=值
    session['yhm'] 获取自定义保存的数据,['键']

    Session封装模块

    #!/usr/bin/env python
    #coding:utf-8
    
    container = {}
    # container = {
    #     # "第一个人的随机字符串":{},
    #     # "第一个人的随机字符串":{'k1': 111, 'parents': '你'},
    # }
    
    class Session:
        def __init__(self, handler,gqshijian):
            """
            创建Session()对象时接收两个参数
            参数1、接收RequestHandler的self对象,也就是继承RequestHandler对象
            参数2、接收cookie过期时间天数
            """
            self.handler = handler                                  #handler接收tornado.web.RequestHandler的self对象,也就是继承RequestHandler对象
            self.random_str = None                                  #初始化随机密串
            self.gqshijian = gqshijian                              #获取设置cookie过期时间
    
        def __genarate_random_str(self):                            #生成随机密串
            import hashlib                                          #导入md5加密模块
            import time                                             #导入时间模块
            obj = hashlib.md5()                                     #创建md5加密对象
            obj.update(bytes(str(time.time()), encoding='utf-8'))   #获取系统当前时间,进行md5加密
            random_str = obj.hexdigest()                            #获取加密后的md5密串
            return random_str                                       #返回加密后的md5密串
    
        def __setitem__(self, key,value):                                   #当创建Session对象,后面跟着[xxx]=xxx的时候自动执行并且接收[xxx]=xxx的值
            """
            使用方法:Session对象[xxx]=xxx
            功能:随机生成密串写入cookie,接收自定义用户数据,添加到cookie密串对应的字典里
            """
            # 在container中加入随机字符串
            # 定义专属于自己的数据
            # 在客户端中写入随机字符串
            # 判断,请求的用户是否已有随机字符串
            if not self.random_str:                                         #判断初始化密串不存在
                random_str = self.handler.get_cookie('xr_cookie')          #获取客服端浏览器get_cookie里的密串
                if not random_str:                                          #判断客服端浏览器get_cookie里如果没有密串
                    random_str = self.__genarate_random_str()               #执行密串生成方法,生成密串
                    container[random_str] = {}                              #在container字典里添加一个,密串作为键,值为空字典的元素
                else:                                                       #如果客服端浏览器get_cookie里有密串
                    # 客户端有随机字符串
                    if random_str in container.keys():                      #判断密串在container字典的键里是否存在
                        pass                                                #如果存在什么都不做
                    else:                                                   #如果不存在
                        random_str = self.__genarate_random_str()           #重新生成密串
                        container[random_str] = {}                          #在container字典里添加一个,密串作为键,值为空字典的元素
                self.random_str = random_str                                #将密串赋值给,初始化密串
            # 如果用户密串初始化就存在,说明登录过并且cookie和container字典里都存在
            container[self.random_str][key] = value                                                     #找到container字典里键为密串的元素值是一个字典,将接收到的key作为键,value作为值添加到元素字典里
            self.handler.set_cookie("xr_cookie", self.random_str,expires_days = self.gqshijian)        #将密串作为cookie值,向浏览器写入cookie
    
        def __getitem__(self,key):                                          #当创建Session对象,后面跟着[xxx]自动执行,并接收[xxx]的值
            """
            使用方法:Session对象[xxx]
            功能:获取cookie对应字典里,键为接收到参数的值,存在返回值,不存在返回None
            """
            # 获取客户端的随机字符串
            # 从container中获取专属于我的数据
            #  专属信息【key】
            random_str =  self.handler.get_cookie("xr_cookie")             #获取cookie里的密串
            if not random_str:                                              #判断cookie里的密串如果不存在
                return None                                                 #返回None
            # 客户端有随机字符串
            user_info_dict = container.get(random_str,None)                 #在container字典里找到密串对应的元素
            if not user_info_dict:                                          #如果container字典里没有密串对应的元素
                return None                                                 #返回None
            #如果cookie里的密串存在,并且container字典里也存在密串对应的元素
            value = user_info_dict.get(key, None)                           #接收用户传来的值,将值作为键找到字典里对应的值
            return value                                                    #返回值

    框架引擎

    #!/usr/bin/env python
    #coding:utf-8
    
    import tornado.ioloop
    import tornado.web                              #导入tornado模块下的web文件
    import session_lei                              #导入session模块
    
    
    
    
    class indexHandler(tornado.web.RequestHandler):  #定义一个类,继承tornado.web下的RequestHandler类
        def get(self):                               #get()方法,接收get方式请求
            session = session_lei.Session(self,1)    #创建session对象,cookie保留1天
            if session['zhuangtai'] == True:         #判断session里的zhuangtai等于True
                self.render("index.html")            #显示查看页面
            else:
                self.redirect("/dlu")                #跳转到登录页面
    
    class dluHandler(tornado.web.RequestHandler):
        def get(self):
            session = session_lei.Session(self,1)    #创建session对象,cookie保留1天
            if session['zhuangtai'] == True:         #判断session里的zhuangtai等于True
                self.redirect("/index")              #跳转到查看页面
            else:
                self.render("dlu.html",tishi = '请登录')  #打开登录页面
        def post(self):
            yhm = self.get_argument('yhm')               #接收用户提交的用户名
            mim = self.get_argument('mim')               #接收用户提交的密码
            if yhm == 'admin' and mim == 'admin':        #判断用户名和密码
                session = session_lei.Session(self,1)    #创建session对象,cookie保留1天
                session['yhm'] = yhm                     #将用户名保存到session
                session['mim'] = mim                     #将密码保存到session
                session['zhuangtai'] = True              #在session写入登录状态
                self.redirect("/index")                  #跳转查看页面
            else:
                self.render("dlu.html",tishi = '用户名或密码错误') #打开登录页面
    
    settings = {                                        #html文件归类配置,设置一个字典
        "template_path":"views",                     #键为template_path固定的,值为要存放HTML的文件夹名称
        "static_path":"statics",                         #键为static_path固定的,值为要存放js和css的文件夹名称
    }
    
    #路由映射
    application = tornado.web.Application([         #创建一个变量等于tornado.web下的Application方法
        (r"/index", indexHandler),                   #判断用户请求路径后缀是否匹配字符串index,如果匹配执行MainHandler方法
        (r"/dlu", dluHandler),
    ],**settings)                                   #将html文件归类配置字典,写在路由映射的第二个参数里
    
    if __name__ == "__main__":
        #内部socket运行起来
        application.listen(8888)                    #设置端口
        tornado.ioloop.IOLoop.instance().start()

    登录页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>请登录</h1>
        <form method="post" action="/dlu">
            用户名<input type="text" name="yhm"/>
            密码<input type="text" name="mim"/>
            <input type="submit" value="提交"/><p style="color: #ff201e">{{tishi}}</p>
        </form>
    </body>
    </html>

    登录后查看页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试网站</title>
        <link rel="stylesheet" href='{{static_url("muban.css")}}'>     <!--接收被继承页面的css连接-->
    </head>
    <body>
    登录后才能查看的信息
    </body>
    </html>

  • 相关阅读:
    Java-16 常用包装类
    Java-15 String类
    flask实现web端微信登录
    Flask-excel导出数据
    Java-14 单例模式
    Java-13 接口
    Java-12 抽象类
    结对项目:一个自动生成小学四则运算题目的命令行程序(c++)
    软工作业:第一次个人项目作业
    操作系统笔记一:操作系统引论
  • 原文地址:https://www.cnblogs.com/adc8868/p/6897662.html
Copyright © 2011-2022 走看看