正文
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)
class SessionInterface(object):
def initialize(self):
self.session = Session(self)
super(SessionInterface, self).initialize()
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)
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 对象。字段值可以包含其他文档,数组及文档数组。