一、为什么需要sesson?

当客户端(或浏览器)需要保存较多信息时,如果通过cookie设置在客户端:

一方面:服务器调用信息时需要浪费很多流量;另一方面:密码、账户等信息,保存在客户端安全;

二、session是什么?

sesson也是用来保存客户端数据的,不同的是:cookie在浏览器端、sesson在服务器端,

sesson是基于cookie设置的,基本原理如下:

1、服务器为登录的客户端生成一个独立的随机码token,

2、服务器开辟一个与随机码一一对应的容器空间,存储客户端数据,

3、随机码通过cookie写入客户端

4、客户端每次请求访问时,通过cookie携带随机码,

5、服务器根据客户端携带的随机码调取相关容器内的保存数据,

三、sesson中数据的保存位置

1、服务器内存:服务器不重启,数据始终保持

2、数据库:不受服务器重启影响

3、缓存:即其他机器的内存


注意:tornado中不含sesson,需要自定义,最基本sesson如下:

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

import tornado.ioloop
import tornado.web

container = {}
# container存放位置:1、内存(服务器不重启,永久生效);2、数据库(不受服务器重启影响);3、缓存(即另一台机器的内存)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        # 首先判断是否已注册,注册过进行如下操作:
        if self.get_argument('u',None) in ['lucy','luna','dongxue']:        # 注册过才能登录
            # 一、进行服务器端sesson配置
            # 1、生成一组随机码(这里使用的是当前时间)
            import hashlib
            import time
            obj = hashlib.md5()
            obj.update(bytes(str(time.time()),encoding='utf-8'))        # 当前时间time.time()是float类型
            random_str = obj.hexdigest()

            # 2、生成随机码对应的容器,保存客户信息
            container[random_str] = {}
            container[random_str]['name'] = self.get_argument('u',None) + "parent"
            container[random_str]['k1'] = 123
            container[random_str]["is_login"] = True

            # 二、进行客户端的sesson配置
            # 将随机码通过cookie写入客户端
            print(random_str)
            self.set_secure_cookie('kkk',random_str)
        else:
            self.write("请注册!")

class ManagerHandler(tornado.web.RequestHandler):       # 模拟登陆后再次访问
    def get(self):
        random_str = str(self.get_secure_cookie('kkk'),encoding='utf-8')
        current_user_info = container.get(random_str,None)
        if not current_user_info:
            self.redirect('/index')
        else:
            if not current_user_info.get("is_login",""):  # current_user_info["is_login"]若取值失败会报错,get更严谨,
                self.redirect('/index')
            else:
                temp = "%s--%s"%(current_user_info.get("k1",""),current_user_info.get("name","")) #str拼接时None会出错
                self.write(temp)

# 路径解析
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