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 ...
- GetPJData - uGetHttpData.pas
function GetPJData(APage: Integer): string; var IdHTTP: TIdHTTP; url: string; paramsList: TStringLis ...
- 未能加载文件或程序集“SuperMap.Mapping, Version=7.0.0.0, Culture=neutral, PublicKeyToken=0635c574ea890381”或它的某一个依赖项。试图加载格式不正确的程序。
开发SuperMap.Mapping的时候,蹦出来的错误!让人摸不着头脑.查找原因如下: (1)安装32位的super map iobject后,进行开发,vs上选择目标平台是x86位的,然后从控件列 ...
- [ZZ] Valse 2017 | 生成对抗网络(GAN)研究年度进展评述
Valse 2017 | 生成对抗网络(GAN)研究年度进展评述 https://www.leiphone.com/news/201704/fcG0rTSZWqgI31eY.html?viewType ...
- Android嵌套滑动不流畅记录随笔
---恢复内容开始--- 今天第一次用到ScrollView嵌套RecyclerView来做页面. 刚开始效果开心得很,非常Very漂亮噢! 纳尼!!!沃特Fuck!出事儿,出事儿! 滑动为何如此不流 ...
- rt-thread平台 动态装载实现原理
原理分析: a.在链接脚本link.lds里定义了专门存放动态符号表的段RTMSymTab. b.内核对外提供可延时绑定的接口在rtm.h中通过RTM_EXPORT将一对对符号+地址构成的表存放到RT ...
- Ubuntu16.04安装Python3.6 和pip(python3 各版本切换)
安装: sudo add-apt-repository ppa:jonathonf/python-3.6 sudo apt-get update sudo apt-get install python ...
- ICE框架双工通讯+MVVM框架测试案例
准备 开发工具 VS2015 ICE框架 https://zeroc.com/ MVVMLight框架 ICE接口文件 #include "./Identity.ice" #inc ...
- Oracle 巡检命令
[grid@XXXXX ~]$ asmcmd -pASMCMD [+] > lsdg
- python excel表格操作
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...