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)

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

猜你喜欢

转载自www.cnblogs.com/lpapython/p/10782579.html