1. 程式人生 > >tornado 基於MongoDB存儲 session組件開發

tornado 基於MongoDB存儲 session組件開發

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()      #數據保存方法,這裏為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組件開發