tornado 基于MongoDB存储 session组件开发
1.开发伊始
根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件
2.开发实现
通过继承实现接口initialize的重写
3.具体代码与实现过程
1)接口
class SessionInterface(object):
def initialize(self):
self.session = Session(self)
super(SessionInterface, self).initialize()
2)session
class Session(object):
def __init__(self, headler):
self.random_str = None #随机字符串
self.headler = headler #Handler对象,通过接口中传参self实现
self.last_session = self.headler.get_cookie('session') #获取之前session
self.db = MongoDB() #数据保存方法,这里为MongoDB
if self.last_session: #若存在之前的cookie,则在数据库中查看是否存在此session
C = self.db.find(self.last_session, 'random_id')
if C == self.last_session:
self.random_str = self.last_session #存在则给随机字符串赋值为原session
else:
self.random_str = self.set_random_str() #不存在则生成随机字符串,并且存储到数据库中
self.db.insert_set_name(self.random_str)
else:
self.random_str = self.set_random_str() #不存在则生成随机字符串,并且存储到数据库中
self.db.insert_set_name(self.random_str)
def clear(self):
self.headler.clear_all_cookies() #清空session
def set_random_str(self):
"""
生成随机字符串
"""
v = str(time.time())
a = hashlib.md5()
a.update(bytes(v, encoding='utf-8'))
return a.hexdigest()
def __getitem__(self, key):
"""
此内置函数通过session[key]形式调用
"""
result = self.db.find(self.random_str, key)
return result
def __setitem__(self, key, value):
"""
此内置函数通过session[key] = value形式调用
"""
self.headler.set_cookie('session', self.random_str)
C = self.db.find(self.random_str, 'random_id')
if C:
self.db.update(self.random_str, key, value)
else:
self.db.insert_set_name(self.random_str)
self.db.update(self.random_str, key, value)
def __delitem__(self, key):
"""
此内置函数通过del session[key]形式调用执行
"""
self.db.remove(self.random_str, key)
3.MongoDB
class MongoDB(object):
def __init__(self):
client = pymongo.MongoClient(host='localhost', port=27017)
self.collection = client.session.sessiondb def insert_set_name(self, random_str): #存储session随机字符串
set_name = {'random_id': random_str}
self.collection.insert_one(set_name) def update(self, random_str, key, value):
condition = {'random_id': random_str}
result = self.collection.find_one(condition)
result[key] = value
self.collection.update(condition, result) def find(self, random_str, key):
condition = {'random_id': random_str}
result = self.collection.find_one(condition)
if result:
return result[key] def remove(self, random_str, key):
condition = {'random_id': random_str}
result = self.collection.find_one(condition)
del result[key]
self.collection.update(condition, result)
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
tornado 基于MongoDB存储 session组件开发的更多相关文章
- 基于vue的新组件开发
前天完成了一个新组件的开发,做的过程也是各种遇到问题,彻底弄懂了slot,巩固了一些flex布局和jquery的知识,比起自己第一次做组件开发,现在已经是能够下手做,遇到问题解决问题,还算有进步. 但 ...
- Express中使用mongodb存储session
express默认有队session的支持,但是是存储在内存中的. 我们可以使用mongodb来存储会话. 但是express的各个版本中对该功能的写法是不同的. Express 2.x: app.u ...
- 实现基于文件存储的Session类
自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...
- js面向对象(三)---组件开发
一.对象的多种表现形式 1.提高对象的复用性 2.如何配置参数和默认参数 不知道该怎么描述,就直接上代码吧,下面做了2个例子,重点看整个组件的大体结构 用组件的方式做拖拽窗口,你可以狠狠的点击这里进行 ...
- 自定义Tornado的session组件
session和cookie的关系 cookie:保存在客户端浏览器上的键值对 session_id = "eyJ1c2VyX2luZm8iOiJ" session:保存在服务器上 ...
- 基于Redis+MySQL+MongoDB存储架构应用
摘 要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...
- Python web框架 Tornado(三)自定义session组件
我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...
- 基于openshift+华为对象存储的CSI开发
目录 需求来源 环境准备 代码修改 镜像下载 镜像生成 修改部署文件 部署CSI插件 CSI原理 核心原理 生命周期: 组件介绍 FAQ 参考: 需求来源 项目上目前使用的是openshift 3.1 ...
- 基于react hooks,zarm组件库配置开发h5表单页面
最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
随机推荐
- 【转】Mysql索引设计原则
来源:https://segmentfault.com/a/1190000000473085 假设一高频查询如下SELECT * FROM user WHERE area='amoy' AND sex ...
- 工控随笔_17_西门子_WinCC的VBS脚本_06_过程和函数
和其他语言一样,vbs提供了过程和函数机制,通过函数和过程可以优化代码结构和实现代码复用, 减少代码的编写量. 一.代码 具体不再多说,看实例代码. ' vbs的函数和过程 '1.过程式编程是一大编程 ...
- LeetCode——295. Find Median from Data Stream
一.题目链接: https://leetcode.com/problems/find-median-from-data-stream 二.题目大意: 给定一段数据流,要求求出数据流中的中位数,其中数据 ...
- nginx1.14.0版本高可用——keepalived双机热备
nginx不支持主从,所以我们需要使用keepalive支持高可用. keepalived重要知识点 在局域网内,每个主机上各安装一个keepalived,注意关闭防火墙firewalld,然后设定一 ...
- localStorage溢出问题
项目使用的store.js库 store.js库不能管理localStorage中的过期项到时清除,只能在再次调用get的时候才做处理,如果一直不调用get,过期了也还是占用着空间.溢出后,再储存项目 ...
- java web开发环境tomcat安装配置
1.下载jdk8并安装 2.下载tomcat windows环境下的免安装版zip包 3.设置两个环境变量 4.在tomcat的bin路径下双击startup.bat 启动tomcat服务器 5.使用 ...
- mysql双机热备的实现
转:http://blog.csdn.net/qq394829044/article/details/53203645 Mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题.还好 ...
- 一个WPF只能输入数字的行为。
没啥好说的,直接上代码: public class NumberInputBehaviour : Behavior<TextBox> { protected override void O ...
- c语言函数参数类似继承的传递
函数的参数如果是一个父结构的指针, 这个结构包含在另一个子结构中, typedef struct test_node_one test_node_one_t; typedef struct test_ ...
- memory_profiler的使用
作用:memory_profiler是用来分析每行代码的内存使用情况 使用方法一: 1.在函数前添加 @profile 2.运行方式: python -m memory_profiler memory ...