python_tornado_session用户验证
什么是session?
-- Django中带有session,tornado中自己写
-- 逻辑整理
用户请求过来,验证通过,随机生成一个字符串当作value返回给浏览器,
在服务器中用户信息与随机生成一个字符串建立对应关系,
下次用户请求带来了cookie,通过字符串找到对应的用户信息。
-- 优点:一切与用户相关的信息都保存在客户端中,
用户端无法获取除了随机字符串其他信息,解决了信息隐患
基于session做用户验证如何做?
-- 定义一个全局字典
-- 验证用户,失败跳转到登录页面
-- 成功 >>生成随机字符串 映射用户信息,登陆状态为True
>>设置cookie,value=随机字符串
-- 下次访问,通过cookie中value,找到映射的用户信息,
找打登录状态,为Ture跳转到成功页面,为False,跳转到登录界面
#!/usr/bin/python3 import tornado.web
import tornado.ioloop
import time
import hashlib user_login = {}
class HomeHandle(tornado.web.RequestHandler): def get(self, *args, **kwargs):
if self.get_argument('u') in ['yizhihua', 'beimenchuixue']: # 判断是合法用户 m = hashlib.md5() # 通过md5获得随机值
m.update(bytes(str(time.time()), encoding='utf-8'))
random_str = m.hexdigest() user_login[random_str] = {} # 全局变量新增一个用户信息字典
user_login[random_str]['username'] = self.get_argument('u') if self.get_argument('u') == 'yizhihua': # 把yizhihua用户信息设置不可登录状态
user_login[random_str]['login_status'] = False
else:
user_login[random_str]['login_status'] = True # 其他用户可以登录 self.set_cookie('yi_ye', random_str)
else:
self.write('请登陆') class ManHandle(tornado.web.RequestHandler): def get(self, *args, **kwargs): random_str = self.get_cookie('yi_ye') # 获得cookie对应的随机字符串 if user_login.get(random_str, None): # 尝试取值,没有相当于没有验证
if user_login[random_str].get('login_status', None): # 判断用户是否可登录状态
temp = '%s-%s' % (user_login[random_str].get('username', ''),
user_login[random_str].get('login_status', ''))
self.write(temp) # 打印登录成功界面
else:
self.redirect('/home') # 返回验证
else:
self.redirect('/home') # 返回验证 setting = {
'template_path': 'template',
'cookie_secret': 'yes' } Appliaction = tornado.web.Application(
[(r'/home', HomeHandle),
(r'/manager', ManHandle),
], **setting
) if __name__ == '__main__':
Appliaction.listen(9999)
tornado.ioloop.IOLoop.instance().start()
-- 启动,通过http://127.0.0.1:9999/home?u=yizhihua 进行验证
上面代码有问题,session部分应该很多地方需要验证,
每个函数都写一个,显得太low了,如何解决?通过类
如何把session定义成一个类?
逻辑整理:
class Session():
def __init__(self,)
def __random_str()
-- 生成随机字符串
def set_value(self):
-- 获得一个随机的数据
-- 定义自己唯一的数据
-- 写入随机字符串
def get_value()
-- 获得客户端随机字符串
-- 取自己的数据
-- 专属信息key
#!/usr/bin/python3 import tornado.web
import tornado.ioloop user_info = {}
# 输入 self
# 内部逻辑 验证用户 生成随机字符串 添加对应用户信息 更改登录状态 发送cookie 获得cookie ,验证,检查登录状态 取出用户信息
# 输出 通过外部参数获得对应的参数
class Session(object):
"""Session验证"""
def __init__(self, handler, cookie_key, url_home): # self对象,cookie的key,url_home跳转主页url
self.handler = handler # self 对象
self.cookie_key = cookie_key # cookie的key
self.url_home = url_home # 验证主页 def __get_random_str(self):
"""获得随机字符串"""
import time
import hashlib
m = hashlib.md5()
m.update(bytes(str(time.time()), encoding='utf-8'))
return m.hexdigest() def set_value(self, get_name, user_status):
"""用户验证"""
if self.handler.get_argument(get_name) in ['yizhihua', 'beimenchuixue']: # 验证用户
random_str = self.__get_random_str()
user_info[random_str] = {} # 初始化用户信息表
user_info[random_str]['username'] = self.handler.get_argument(get_name)
user_info[random_str]['user_status'] = user_status
user_info[random_str]['work'] = 'student'
user_info[random_str]['addr'] = '湖南' self.handler.set_cookie(self.cookie_key, random_str) # 设置cookie
self.handler.redirect('/manager') # 验证成功跳转到/manager页面
else:
self.handler.redirect(self.url_home) # 验证失败重新验证 def get_value(self, user_key):
"""取cookie值,取用户信息"""
random_str = self.handler.get_cookie(self.cookie_key, None)
if random_str: # 判断是否有对应的cookie值
if random_str in user_info: # 验证cookie
if user_info[random_str].get('user_status', None): # 判断可登录状态
return user_info[random_str].get(user_key, None) # 取值
else:
self.handler.write('不可登录状态')
else:
self.handler.redirect(self.url_home)
else:
self.handler.redirect(self.url_home) class Home(tornado.web.RequestHandler): def get(self, *args, **kwargs):
self.render('home.html') # form表单 class HomeHandle(tornado.web.RequestHandler): def get(self, *args, **kwargs):
session = Session(self, 'yi_ye', '/home/')
session.set_value('u', True) class ManHandle(tornado.web.RequestHandler): def get(self, *args, **kwargs): session = Session(self, 'yi_ye', '/home')
work = session.get_value('work')
addr = session.get_value('addr')
print(work, addr) setting = {
'template_path': 'views',
'cookie_secret': 'yes' } Appliaction = tornado.web.Application(
[(r'/home', HomeHandle),
(r'/home/', Home),
(r'/manager', ManHandle),
], **setting
) if __name__ == '__main__':
Appliaction.listen(9999)
tornado.ioloop.IOLoop.instance().start()
如何在这个session类中调用处理函数中的方法?
-- 可以把class逻辑处理类中的self对象当做参数传入进来,
然后通过session类__init__析构函数给self对象进行重新命名,
然后就通过新的名字调用class逻辑处理类中的任何方法
上面的方式并没有实现面向过程,如何实现?
--start.py 写入
#!/usr/bin/python3
import tornado.web
import tornado.ioloop
user_info = {} # 临时存放用户信息列表
user_eyes = [{'yizhihua': '18'}, {'hehe': '19'}]
# 入 self 验证 生成cookie 更改用户可登录状态
class Session(object):
"""session验证"""
def __init__(self, handler):
self.handler = handler def __get_random_str(self):
"""生产随机数"""
import time, hashlib
m = hashlib.md5()
m.update(bytes(str(time.time()), encoding='utf-8'))
random_str = m.hexdigest()
return random_str
pass def __setitem__(self, key, value):
"""验证登录,设置值"""
user_name = self.handler.get_argument('user_name') # 获取前端验证
pwd = self.handler.get_argument('pwd')
print(user_name, pwd)
if {user_name: pwd} in user_eyes: # 判断用户合法
if not self.handler.get_cookie('yi_ye', None): # 如果cookie存在,不生成随机字符串
random_str = self.__get_random_str() # 生成随机字符串
else:
random_str = self.handler.get_cookie('yi_ye', None) # 就算是用户伪造cookie也得是验证通过的情况下
user_info[random_str] = {} # 添加用户信息
user_info[random_str]['user_name'] = user_name
user_info[random_str]['pwd'] = pwd
user_info[random_str][key] = value # 通过接口设置登录状态
print(user_info) self.handler.set_cookie('yi_ye', random_str) # 生成cookie
self.handler.render('home.html', user_name=user_name) # 登录页面
else:
self.handler.redirect('/login') # 返回登录 def __getitem__(self, item):
"""验证session,获取值"""
random_str = self.handler.get_cookie('yi_ye', None) # 获取cookie
if user_info: # 判断user_info是否有值
if random_str: # 判断cookie使用有值
server_info = user_info.get(random_str, None) # 判断user_info对应的值
if server_info.get('status'): # 判断状态
return server_info.get(item, None) # 获取值
else:
self.handler.redirect('/login') # 以上任意一个条件不满足,退回登录界面
else:
self.handler.redirect('/login')
else:
self.handler.redirect('/login') class BaseHandler(tornado.web.RequestHandler):
"""让其他处理类每次都先实例session对象"""
def initialize(self):
self.session = Session(self) # 实例Session类,self为每个类处理对象 # 登录界面不需要session验证,打开隐私界面需要session验证 class Login(BaseHandler): def get(self, *args, **kwargs):
self.render('login.html') def post(self, *args, **kwargs):
self.session['status'] = True # 设置登录状态为True class Home(BaseHandler): def get(self, *args, **kwargs):
if self.session['status']: # 取登录状态
self.render('home.html', user_name=self.session['user_name']) # 验证,并模版渲染 setting ={
'template_path': 'views',
'static_path': 'statics'
} Application = tornado.web.Application(
[
(r'/login', Login),
(r'/home', Home),
], **setting
) if __name__ == '__main__':
Application.listen(9999)
tornado.ioloop.IOLoop.instance().start()
-- login.html 写入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/login" method="post">
<p>账户:<input name='user_name' type="text" ></p>
<p>密码:<input name='pwd' type="password"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
-- home.html 写入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<p><h>欢迎来到{{user_name}}主页</h></p>
<p><input type="button" value="退出登录"></p>
</body>
</html>
如何逻辑整理?
-- 用户行为:进入登录界面、输入验证信息、提交、进入隐私页面
-- 服务器行为:验证合法性、成功跳转到隐私页面、设置session_cookie、请求隐私页面验证session,登录界面提交验证不需要验证session
-- 整个流程:输入验证、提交、后台验证合法性、合法生成session_cookie并且进入隐私页面、失败重新跳转到登录、
用户请求隐私页面、验证session_cookie、通过则跳转、不通过则跳转到登录界面
python_tornado_session用户验证的更多相关文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...
- 来玩Play框架06 用户验证
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 用户验证(User Authentification)复合的使用Play框架的数个 ...
- spring4.0整合mongodb3.0.4项目实践(用户验证)
我们的项目用到了spring框架和mongdb数据库,随着mongodb升级到3.0已有半年时间,我们也开始随之升级,但是3.0的用户验证有所更改,导致原来的很多配置无法再用. 经过几天的尝试后,终于 ...
- mongdb3.0用户验证问题
1. 用户验证方式更改: Mongodb2.6的默认用户验证方式是:MONGODB-CR Mongodb3.0的默认用户验证方式是:SCRAM-SHA-1 因为新的验证方式在spring和java中 ...
- 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4
以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...
- [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室
原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...
- php用户验证代码的简单例子
发布:sunday01 来源:net [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...
- MVC WebApi 用户验证 (2)
构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2) 前言: 构建ASP.NET MVC5+EF6+E ...
随机推荐
- (译)Web是如何工作的(3):HTTP&REST
原文地址:https://medium.freecodecamp.org/how-the-web-works-part-iii-http-rest-e61bc50fa0a 我们在第一篇文章中介绍了 ...
- 使用阿里云镜像maven管理配置开发环境
修改方法:在~/.m2目录下的settings.xml文件中,(如果该文件不存在,则需要从maven/conf目录下拷贝一份),找到<mirrors>标签,添加如下子标签: <mir ...
- jquery/Js属性无效
今天遇到个很奇葩的问题,就是checkbox的onchange时间无效,我一共写了两个checkbox的onchange事件,但就是只有一个能用,本来我以为是jquery的兼容问题,但是换成js还是不 ...
- 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录 1.集成的Windows身份验证语法范例 1 string constr = "server=.;databa ...
- VS如何设置类或函数前不显示引用的数量
问题如下: 取消显示这个引用的步骤: 找到菜单栏: 工具 ---> 选项 ---> 文本编辑器 ---> 所有语言 ---> CodeLens 设置取消启用CodeLens, ...
- ES6小点心第二弹——底部浮现弹窗
小点心,顾名思义,开箱即食,拿来即用. 献上第二个小点心:SlidePopup. GitHub 在线演示 GitHub 上欢迎大家来找茬^_^ 前端朋友们,今天要介绍的这款小点心牛B了.相信是个前端都 ...
- form表单转换为Json数据
最近对前端js学习有点多,如今想自己动手写点插件,后来发现,我想到的,其他人都想到了.于是做了以下笔记. 使用插件: 插件 :https://github.com/marioizquierdo/jqu ...
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
Safecracker Time Limit: 2 Seconds Memory Limit: 65536 KB === Op tech briefing, 2002/11/02 06:42 ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- hihoCoder #1043 : 完全背包(板子题)
#1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...