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 对象. 字段值可以包含其他文档, 数组及文档数组.
来源: http://www.bubuko.com/infodetail-3038909.html