tornado 基於MongoDB存儲 session組件開發
阿新 • • 發佈:2019-04-28
hashlib 字段 elf quest 語言 cond 系統 cookie oca
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() #數據保存方法,這裏為MongoDBif 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組件開發