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表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
随机推荐
- centos7系统优化定制
#!/bin/bash #author junxi by #this script is only for CentOS 7.x #check the OS platform=`uname -i` i ...
- tensorboard OSError:[Errno 22] Invalid argument
哈哈 问题解决了.感谢大佬 Bill.Z 附上原文链接:https://blog.csdn.net/u013244846/article/details/88380860 解决方法:更改manager ...
- Ignite(三): Ignite VS Spark
参考:https://www.itcodemonkey.com/article/9613.html gnite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 I ...
- python3-可变长度参数函数(*args 和 **kwargs)
简述: *args: 可变长度元组参数 **kwargs: 可变长度字典参数 ------------------------------------------------------- ...
- 【rabbitmq】RabbitMQ 集群与网络分区
网络分区(network partitions) 官网-网络分区 网络设备故障导致的网络分裂.比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连.若 ...
- django 的后台管理
class bcb(models.Model): name = models.CharField(max_length=64,verbose_name='班次名称') verbose_name = ' ...
- sql server 合并字段
合并字段用+号连接就可以了,不过要判断是不是有的合并项为NULL.如果其中一项为NULL,则整个合并字段为NULL. (IsNull(a.supplier, '') + IsNull(a.po, ' ...
- C# 6.0:Expression – Bodied Methods
Expression-bodied 方法是C# 6.0 中另一个能简化代码的特性.我们已经对lambda表达式将funciton和delegation关联起来的这种用法很熟悉了.Expression- ...
- 20164310Exp1 PC平台逆向破解和BOF基础
1.逆向及Bof基础实践说明 1.1实践目标 实践对象:pwn1的linux可执行文件 实践目的:使程序执行另一个代码(ShellCode) 实践内容: 手工修改可执行文件,改变程序执行 ...
- html/css/js----js中遇到的一些问题
学习前端的时候有时也会遇到一些弄不明白的问题,学习js会有更多的方法不清楚它的用法,我谨以在学习中遇到的一些问题记录下来,以便日复习! 一."window.opener.location.r ...