当前位置: 首页 > news >正文

第二百六十九节,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>

 

相关文章:

  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Scrapy基础(十)———同步机制将Item中的数据写在Mysql
  • ucore操作系统实验笔记 - 重新理解中断
  • 评论发布信息可插入QQ表情
  • 数据中心操作人员:艰难地在针对VM构建的基础设施上运行容器
  • Event 营销热点日历
  • 使用SuperSocket快速建立Socket服务
  • JSON中JObject和JArray的修改
  • 思维的框架
  • 《数据分析实战 基于EXCEL和SPSS系列工具的实践》一3.3 耗时耗力的数据整理过程...
  • eclipse+tomcat配置远程debug调整
  • myeclipse 10 j安装了JDK1.7,java编译器无法选择到1.7的问题
  • JAVA注解引发的思考
  • 基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
  • pageoffice相关问题整理
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [译] React v16.8: 含有Hooks的版本
  • Android框架之Volley
  • Django 博客开发教程 16 - 统计文章阅读量
  • DOM的那些事
  • iOS 颜色设置看我就够了
  • js数组之filter
  • Webpack 4x 之路 ( 四 )
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 首页查询功能的一次实现过程
  • 小而合理的前端理论:rscss和rsjs
  • 阿里云ACE认证学习知识点梳理
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (1)Nginx简介和安装教程
  • (4)logging(日志模块)
  • (7)STL算法之交换赋值
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (独孤九剑)--文件系统
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十一)手动添加用户和文件的特殊权限
  • (转载)Linux 多线程条件变量同步
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .Net core 6.0 升8.0
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net FrameWork简介,数组,枚举
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 材料检测系统崩溃分析
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 中让 Task 支持带超时的异步等待
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @开发者,一文搞懂什么是 C# 计时器!
  • [AIGC] Kong:一个强大的 API 网关和服务平台