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组件开发的更多相关文章

  1. 基于vue的新组件开发

    前天完成了一个新组件的开发,做的过程也是各种遇到问题,彻底弄懂了slot,巩固了一些flex布局和jquery的知识,比起自己第一次做组件开发,现在已经是能够下手做,遇到问题解决问题,还算有进步. 但 ...

  2. Express中使用mongodb存储session

    express默认有队session的支持,但是是存储在内存中的. 我们可以使用mongodb来存储会话. 但是express的各个版本中对该功能的写法是不同的. Express 2.x: app.u ...

  3. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  4. js面向对象(三)---组件开发

    一.对象的多种表现形式 1.提高对象的复用性 2.如何配置参数和默认参数 不知道该怎么描述,就直接上代码吧,下面做了2个例子,重点看整个组件的大体结构 用组件的方式做拖拽窗口,你可以狠狠的点击这里进行 ...

  5. 自定义Tornado的session组件

    session和cookie的关系 cookie:保存在客户端浏览器上的键值对 session_id = "eyJ1c2VyX2luZm8iOiJ" session:保存在服务器上 ...

  6. 基于Redis+MySQL+MongoDB存储架构应用

    摘  要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...

  7. Python web框架 Tornado(三)自定义session组件

    我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...

  8. 基于openshift+华为对象存储的CSI开发

    目录 需求来源 环境准备 代码修改 镜像下载 镜像生成 修改部署文件 部署CSI插件 CSI原理 核心原理 生命周期: 组件介绍 FAQ 参考: 需求来源 项目上目前使用的是openshift 3.1 ...

  9. 基于react hooks,zarm组件库配置开发h5表单页面

    最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...

随机推荐

  1. 关于sql 索引

    1.聚集索引一个表只能有一个,而非聚集索引有个表能有多个 2.聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么 ...

  2. Ubuntu16.04下安装xunsearch+opencc实现php客户端的中文分词

    1.准备服务器环境 apt-get install apache2 php mysql-server apt-get install mysql-client phpmyadmin apt-get i ...

  3. windows使用ruby配置redis集群

    基本是从网上抄的.不过网上的东西不一定是完全正确的 我修正了一下 首先,资源有限,我就不搞什么主机从机了,我需要的集群实现内存的最大化 四台机器安装redis, 配置成服务, 打开6379端口,集群1 ...

  4. prepareRefresh()方法源码探究

    该方法目的是做刷新上下文前的准备工作: 首先清空bean扫描器map中的内容,然后调用父类的prepareRefresh方法: 父类的准备刷新方法,主要做了3个工作: 1.简单的标志赋值----> ...

  5. 和2018年年初做管理系统的不同(vuex)

    从2017年底开始做公司批改后台系统(服务内部人员对熊猫小课用户的作业进行批改.对批改员工资结算等)到教务系统(服务于内部人员对熊猫小课等移动端产品的内容进行配置等).ai-boss系统(服务于内部人 ...

  6. TableVie优化方法和优化机制

    1,UITableview的优化方法(缓存高度,异步绘制,减少层级,hide,避免离屏渲染) (1)缓存高度:当我们创建frame模型的时候,计算出来cell的高度的时候,我们可以将cell的高度缓存 ...

  7. jumpservice一步一步安装

    一步一步安装 (CentOS) 本文档旨在帮助用户了解各组件之间的关系, 生产环境部署建议参考 进阶安装文档 云服务器快速部署参考 极速安装 安装过程中遇到问题可参考 安装过程中常见的问题 测试推荐环 ...

  8. ADT工具使用详解

    备注:一下内容为本人手工翻译官方文档注解,如有翻译不到位的地方,欢迎批评指正; ADT(Android开发工具)是Eclipse的插件,它提供了一套与Eclipse IDE集成的工具.它可以让您访问许 ...

  9. C#动态给Word文档填充内容

    //filePath:word文档的路径:strOld:需要替换的内容:strNew:替换的新内容: //注意:strOld中的字符数量要与新的strNew中的一一对应 public static v ...

  10. 自学大数据(hadoop)小插曲__虚拟机工具

    安装VMware Tools VMware 版本:10.0.1 ubuntu(linux) 版本:16.04 LTS 序言:本来第一天可以访问共享文件夹,第二天重新安装了四个ubuntu,可惜确无法访 ...