什么是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用户验证的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  2. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法

    SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...

  3. 来玩Play框架06 用户验证

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 用户验证(User Authentification)复合的使用Play框架的数个 ...

  4. spring4.0整合mongodb3.0.4项目实践(用户验证)

    我们的项目用到了spring框架和mongdb数据库,随着mongodb升级到3.0已有半年时间,我们也开始随之升级,但是3.0的用户验证有所更改,导致原来的很多配置无法再用. 经过几天的尝试后,终于 ...

  5. mongdb3.0用户验证问题

    1.  用户验证方式更改: Mongodb2.6的默认用户验证方式是:MONGODB-CR Mongodb3.0的默认用户验证方式是:SCRAM-SHA-1 因为新的验证方式在spring和java中 ...

  6. 使用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 ...

  7. [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室

    原地址:http://bbs.9miao.com/thread-44571-1-1.html 前言:早在群里看到大鸡蛋分享他们团队的Firefly引擎,但一直没有时间去仔细看看,恰好最近需要开发一个棋 ...

  8. php用户验证代码的简单例子

    发布:sunday01   来源:net     [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...

  9. MVC WebApi 用户验证 (2)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)   前言: 构建ASP.NET MVC5+EF6+E ...

随机推荐

  1. [Spark内核] 第35课:打通 Spark 系统运行内幕机制循环流程

    本课主题 打通 Spark 系统运行内幕机制循环流程 引言 通过 DAGScheduelr 面向整个 Job,然后划分成不同的 Stage,Stage 是從后往前划分的,执行的时候是從前往后执行的,每 ...

  2. [Spark内核] 第40课:CacheManager彻底解密:CacheManager运行原理流程图和源码详解

    本课主题 CacheManager 运行原理图 CacheManager 源码解析 CacheManager 运行原理图 [下图是CacheManager的运行原理图] 首先 RDD 是通过 iter ...

  3. Java 非线程安全的HashMap如何在多线程中使用

    Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的.在多线程条件下,容易导致死循环,具体表现为CPU使用率100%.因此多线程环境下保证 HashMap 的线程安全 ...

  4. C#中的异步学习

    C#中的异步 C#5.0版本发布有一个"主题那就是异步编程. 我们先创建一个windowForm窗体,实现下面效果,然后我们通过简单的案例对比同步和异步: 首先我们编写一个耗时方法: /// ...

  5. zz:linux下rz,sz的安装方法

    zz:http://xukaizijian.blog.163.com/blog/static/1704331192011611104631875/ wget http://ohse.de/uwe/re ...

  6. api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?

    api接口写好了?想过(Accept,Content-Type)?返回类型json|xml? 起因: - A,B. A调用B提供的api接口. - A:为毛你的接口返回的是xml格式的(浏览器访问)? ...

  7. 【LCT维护基环内向树森林】BZOJ4764 弹飞大爷

    4764: 弹飞大爷 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 101  Solved: 52[Submit][Status][Discuss] ...

  8. Sql的基础知识(一)

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份 sql server --- ...

  9. ES5.0集群搭建

    最近在网上看到很多ES集群的搭建方法,本人在这人使用Elasticsearch5.0.1版本,介绍如何搭建es集群并安装head插件和其他插件安装方法. 一.搭建环境(2台Centos7系统服务器) ...

  10. 听说 Android 9.0 要禁用 @Hide Api 的调用,你怎么看?

    Android 9.0? Hi,大家好,我是承香墨影! 距离 Android 8.0 发布,已经过了五个月,虽然现在占有率并不高,不过呢,Google 已经着手准备下一版本的 Android 系统. ...