第二百六十九节,Tornado框架-Session登录判断

时间:2022-09-09 16:54:24

Tornado框架-Session登录判断

Session需要结合cookie来实现

Session的理解

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

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

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

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

第二百六十九节,Tornado框架-Session登录判断

框架引擎

#!/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>

第二百六十九节,Tornado框架-Session登录判断

第二百六十九节,Tornado框架-Session登录判断的更多相关文章

  1. 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入

    Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...

  2. 第二百六十三节,Tornado框架-基于正则的动态路由映射

    Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...

  3. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch&lpar;搜索引擎&rpar;用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  4. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  5. 第二百七十三节,Tornado框架-文件上传

    Tornado框架-文件上传 第一.普通表单上传文件 self.request.files["fafafa"] 获取上传文件信息,参数["上传文件框的name名称&quo ...

  6. 第二百六十五节,xss脚本攻击介绍

    xss脚本攻击介绍 Cross-Site Scripting(XSS)是一类出现在 web 应用程序上的安全弱点,攻击者可以通过 XSS 插入一 些代码,使得访问页面的其他用户都可以看到,XSS 通常 ...

  7. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  8. 第二百七十九节,MySQL数据库-pymysql模块操作数据库

    MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...

  9. 第二百三十九节,Bootstrap路径分页标签和徽章组件

    Bootstrap路径分页标签和徽章组件 学习要点: 1.路径组件 2.分页组件 3.标签组件 4.徽章组件 本节课我们主要学习一下 Bootstrap 的四个组件功能:路径组件.分页组件.标签组件 ...

随机推荐

  1. JS 笔记(一)

    1. 页面引入 1) 标签直接引入脚本(推荐): <script type="text/javascript"> 脚本语言 </script> 2) 标签引 ...

  2. cf306 C&period; Divisibility by Eight&lpar;数学推导)

    C. Divisibility by Eight time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. TLV----Demo讲解

    接触过网络协议的人对TLV一定或多或少的知道.作为一种自定义应用层标准. TLV使用十分广泛.他对数据封包有着很好的定义,简单实用. TLV即Type-Length-Value.即我们每个封装成TLV ...

  4. PHP 接口 返回构造函数

    我们写接口的时候,需要返回json数据,并且里面有错误码,错误信息 还有要返回的数据,这里我构造了一个函数 这里是针对TP5来写的,自己可以根据自己的框架来修改 这样就可以在返回的时候直接用info函 ...

  5. Linux三剑客-SED

    1.Sed是什么 Sed:字符流编辑器,Stream Editor 2.Sed功能与版本 处理日志文件,日志,配置文件等 增加.删除.修改.查询 sed --version 可以通过man sed 来 ...

  6. (set stringstream)单词数 hdu2072

    单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

  8. Asp&period;net MVC重要

    1.asp.net mvc百度解释 2.asp.net mvc各版本特点 3.asp.net mvc知多少 4.asp.net mvc4入门到精通系列目录汇总(邹琼俊)[重要] 5.新年奉献MVC+E ...

  9. Android-SDCardUtil-工具类

    SDCardUtil-工具类,是专门处理,外置存储Sdcard的操作 package common.library.utils; import android.annotation.SuppressL ...

  10. sqlzoo练习答案--SUM and COUNT

    World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...