基于sesson的基本原理和步骤,在tornado中进行自定义,初级版本如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web

container = {}

class Sesson:
    def __init__(self,handler):
        self.handler = handler
        self.random_str = None
    def __generate_random_str(self):
        # 生成一组随机码(这里使用的是当前时间)
        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()),encoding='utf-8'))
        random_str = obj.hexdigest()
        return random_str

    def set__value(self,key, value):
        # 生成随机码对应的容器,保存客户信息,将随机码写入客户端
        if not self.random_str:                     # 一次请求,多次操作时,避免重复刷新随机码
            random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
            if not random_str:                                                                 # 如果客户端没有随机码,生成
                random_str = self.__generate_random_str()
                container[random_str] = {}
            else:
                if random_str in container.keys():                             # 如果客户端有随机码,且与服务器端一致,保留
                    pass
                else:                                                  # 如果客户端有随机码,但是与服务器端不一致,重新生成
                    random_str = self.__generate_random_str()
                    container[random_str] = {}
            self.random_str = random_str
        container[self.random_str][key] = value
        self.handler.set_secure_cookie('kkk',self.random_str)

    def get_value(self,key):
        # 获取客户端的随机码,提取数据
        random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
        if not random_str:                                                     # 如果客户端没有随机码,取不到值,返回空
            return None
        user_info_dict = container.get(random_str,None)            # 如果客户端有随机码,但是与服务器端不匹配,也返回空
        if not user_info_dict:
            return None
        val = user_info_dict.get(key,None)                         # 如果客户端有随机码,且与服务器端一致,返回相应的值
        return val


class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        if self.get_argument('u',None) in ['lucy','luna','dongxue']:
            s = Sesson(self)
            s.set__value('is_login',True)
            s.set__value('name',self.get_argument('u',None))
            print(container)
        else:
            self.write("请注册!")

class ManagerHandler(tornado.web.RequestHandler):
    def get(self):
        s = Sesson(self)
        val = s.get_value('is_login')
        if val:
            self.write(s.get_value('name'))
        else:
            self.write("失败!")

# 路径解析
settings = {
    "template_path":"views",
    "static_path":"statics",
    "cookie_secret":"nifjewoifnewkfcn",
}

# 二级路由,先匹配域名,
application = tornado.web.Application([
    (r"/index",IndexHandler),
    (r"/manager",ManagerHandler),
],**settings)


# 开启服务器,监听
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
View Code

在上诉版本中,每一个handler中,都需要实例化一次Sesson,比较麻烦,

可以应用tornado类__init__()中的initialize(),进一步优化如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web

container = {}

class Sesson:
    def __init__(self,handler):
        self.handler = handler
        self.random_str = None
    def __generate_random_str(self):
        # 生成一组随机码(这里使用的是当前时间)
        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()),encoding='utf-8'))
        random_str = obj.hexdigest()
        return random_str

    def set__value(self,key, value):
        # 生成随机码对应的容器,保存客户信息,将随机码写入客户端
        if not self.random_str:                     # 一次请求,多次操作时,避免重复刷新随机码
            random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
            if not random_str:                                                                 # 如果客户端没有随机码,生成
                random_str = self.__generate_random_str()
                container[random_str] = {}
            else:
                if random_str in container.keys():                             # 如果客户端有随机码,且与服务器端一致,保留
                    pass
                else:                                                  # 如果客户端有随机码,但是与服务器端不一致,重新生成
                    random_str = self.__generate_random_str()
                    container[random_str] = {}
            self.random_str = random_str
        container[self.random_str][key] = value
        self.handler.set_secure_cookie('kkk',self.random_str)

    def get_value(self,key):
        # 获取客户端的随机码,提取数据
        random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
        if not random_str:                                                     # 如果客户端没有随机码,取不到值,返回空
            return None
        user_info_dict = container.get(random_str,None)            # 如果客户端有随机码,但是与服务器端不匹配,也返回空
        if not user_info_dict:
            return None
        val = user_info_dict.get(key,None)                         # 如果客户端有随机码,且与服务器端一致,返回相应的值
        return val


class BaseHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.sesson = Sesson(self)

class IndexHandler(BaseHandler):
    def get(self):
        if self.get_argument('u',None) in ['lucy','luna','dongxue']:
            self.sesson.set__value('is_login',True)
            self.sesson.set__value('name',self.get_argument('u',None))
            print(container)
        else:
            self.write("请注册!")

class ManagerHandler(BaseHandler):
    def get(self):
        val = self.sesson.get_value('is_login')
        if val:
            self.write(self.sesson.get_value('name'))
        else:
            self.write("失败!")

# 路径解析
settings = {
    "template_path":"views",
    "static_path":"statics",
    "cookie_secret":"nifjewoifnewkfcn",
}

# 二级路由,先匹配域名,
application = tornado.web.Application([
    (r"/index",IndexHandler),
    (r"/manager",ManagerHandler),
],**settings)


# 开启服务器,监听
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
View Code

其他语言中的sesson,通用格式如:self.sesson【"is_login"】= True,

应用python中的__setitem__、__getitem__、__delitem__,进一步优化如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web

container = {}

class Sesson:
    def __init__(self,handler):
        self.handler = handler
        self.random_str = None

    def __generate_random_str(self):
        # 生成一组随机码(这里使用的是当前时间)
        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()),encoding='utf-8'))
        random_str = obj.hexdigest()
        return random_str

    def __setitem__(self, key, value):
        # 生成随机码对应的容器,保存客户信息,将随机码写入客户端
        if not self.random_str:                     # 一次请求,多次操作时,避免重复刷新随机码
            random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
            if not random_str:                                                                 # 如果客户端没有随机码,生成
                random_str = self.__generate_random_str()
                container[random_str] = {}
            else:
                if random_str in container.keys():                             # 如果客户端有随机码,且与服务器端一致,保留
                    pass
                else:                                                  # 如果客户端有随机码,但是与服务器端不一致,重新生成
                    random_str = self.__generate_random_str()
                    container[random_str] = {}
            self.random_str = random_str
        container[self.random_str][key] = value
        self.handler.set_secure_cookie('kkk',self.random_str)

    def __getitem__(self, key):
        # 获取客户端的随机码,提取数据
        random_str = str(self.handler.get_secure_cookie('kkk'),encoding='utf-8')                    # 获取客户端随机码
        if not random_str:                                                     # 如果客户端没有随机码,取不到值,返回空
            return None
        user_info_dict = container.get(random_str,None)            # 如果客户端有随机码,但是与服务器端不匹配,也返回空
        if not user_info_dict:
            return None
        val = user_info_dict.get(key,None)                         # 如果客户端有随机码,且与服务器端一致,返回相应的值
        return val


class BaseHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.sesson = Sesson(self)

class IndexHandler(BaseHandler):
    def get(self):
        if self.get_argument('u',None) in ['lucy','luna','dongxue']:
            self.sesson['is_login'] = True
            self.sesson['name'] = self.get_argument('u',None)
            print(container)
        else:
            self.write("请注册!")

class ManagerHandler(BaseHandler):
    def get(self):
        val = self.sesson['is_login']
        if val:
            self.write(self.sesson['name'])
        else:
            self.write("失败!")

# 路径解析
settings = {
    "template_path":"views",
    "static_path":"statics",
    "cookie_secret":"nifjewoifnewkfcn",
}

# 二级路由,先匹配域名,
application = tornado.web.Application([
    (r"/index",IndexHandler),
    (r"/manager",ManagerHandler),
],**settings)


# 开启服务器,监听
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
View Code