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 对象。字段值可以包含其他文档,数组及文档数组。