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

import tornado.webimport tornado.ioloop

container = {}

# container是一个储存在服务端包含客户端相关信息的字典,以键值对的形式存在

class Session:    def __init__(self, handler):        self.handler = handler        # Session(self),self为Indexhandler实例化之后的对象        self.random_str = None

    def __genarate_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):        # 当类的对象 obj["random_str"]="key-value的值" 自动执行这个函数        # 总的来说,服务端先检测客户端有没有随机字符串,这里随机字符串是cookie的值        # 而随机字符串的value对应的是session的key        # 如果客户端没有随机字符串,则生成一个新的随机字符串        # 如果客户端有随机字符串,        # 检查该随机字符串服务端的session有没有,有先不做操作        # 如果服务端没有这个随机字符串,则执行__genarate_random_str()生成新的随机字符串        # 并把该随机字符串作为session的key值

        # 当然前提条件是你已经通过身份验证才会有以上的操作

        if not self.random_str:            # 首先客户端发请求过来并要设置session里面的key-value值的时候触发__setitem__            # 一开始self.random_str为None,            # 服务端先检测客户端有没有名为'__session__'的键值对(cookie)

            random_str = self.handler.get_cookie('__session__')            # 如果此时random_str为None,即客户端没有名为'__session__'的cookie            # 执行__genarate_random_str()生成随机字符串            # 并把该随机字符串作为session的key值            if not random_str:                random_str = self.__genarate_random_str()                container[random_str] = {}                # 然后此处按理来说应该为客户端设置key为'__session__',value为随机字符串的cookie            else:                # 如果此时客户端有名为'__session__'的cookie,                # 那么我们就要检测这个随机字符串是否存在于session里面                if random_str in container.keys():                    pass                else:                    # 如果不存在,就重新创造一个新的字符串并加入到session里                    random_str = self.__genarate_random_str()                    container[random_str] = {}            self.random_str = random_str

        container[self.random_str][key] = value        self.handler.set_cookie("__session__", self.random_str)

    def __getitem__(self, key):        # 当客户端请求manage页面,需要通过session验证        # 如果服务端拿到类随机字符串,则服务端把该字符串所对应的相关信息发送给浏览器端        random_str = self.handler.get_cookie("__session__")

        if not random_str:            return None        user_info_dict = container.get(random_str, None)        if not user_info_dict:            return None        value = user_info_dict.get(key, None)        return value

class BaseHandler(tornado.web.RequestHandler):    def initialize(self):        self.session = Session(self)

# 只要实例初始化都会执行这个函数# self.session为session这个类的对象,通过self.session可以访问session这个类的属性和方法

class IndexHandler(BaseHandler):    def get(self):        if self.get_argument("u", None) in ["alex", "eric"]:            # 判断用户密码是否正确,只有用户密码正确了才能够设置session            self.session["is_login"] = True            # 自动触发__setitem__,在__setitem__里面直接完成随机字符串的检验,            # 生成,cookie的生成,session的设置            self.session["name"] = self.get_argument("u", None)            print(container)            self.write("cookie设置成功了")        else:            self.write("请登录")

class ManaggerHandler(BaseHandler):    def get(self, *args, **kwargs):        print(container)        # print(self.get_cookie("__session__"))        val = self.session["is_login"]        # 自动触发__getitem__        if val:            self.write(self.session["name"] + "登录成功")        else:            self.write("登录失败")

# 图片验证码

class CheckCodeHandler(BaseHandler):    def get(self, *args, **kwargs):        # 生成 图片并且返回        import io        import check_code        mstream = io.BytesIO()        img, code = check_code.create_validate_code()

        # 将图片对象写入mstream,        img.save(mstream, "GIF")        # 为每个用户保存期验证码        self.session["CheckCode"] = code

        self.write(mstream.getvalue())

class LoginHandler(BaseHandler):    def get(self, *args, **kwargs):        self.render('login.html', status="")

    def post(self, *args, **kwargs):        user = self.get_argument('user', None)        pwd = self.get_argument('pwd', None)        code = self.get_argument('code', None)

        check_code = self.session["CheckCode"]        if code.upper() == check_code.upper():            self.write('验证码正确')        else:            # self.redirect('/login')            self.render('login.html', status='验证码错误')

# csrf

class CsrfHandler(BaseHandler):    def get(self, *args, **kwargs):        self.render('csrf.html')

    def post(self, *args, **kwargs):        self.write('csrf.post')

settings = {    "template_path": "views",    "static_path": "Statics",    "static_url_prefix": "/Statics/",    "cookie_secret": "abcdef",    'xsrf_cookies': True

}

application = tornado.web.Application([    (r"/index", IndexHandler),    (r"/manager", ManaggerHandler),    (r"/login", LoginHandler),    (r"/check_code", CheckCodeHandler),    (r"/csrf", CsrfHandler),

], **settings)

if __name__ == '__main__':    application.listen(9000)    tornado.ioloop.IOLoop.instance().start()

转载于:https://www.cnblogs.com/liangweixiong/p/6418052.html

关于tornado中session的总结相关推荐

  1. 为tornado自定义session

    cookie和session 在自定义session前,我们需要先了解cookie和session是什么,可以参考我之前的博客:http://blog.csdn.net/ayhan_huang/art ...

  2. php session举例,PHP 中session的经典用法

    PHP中session的经典用法 PHP中的session默认情况下是使用客户端的Cookie.当客户端的Cookie被禁用时,会自动通过Query_String来传递. Php处理session会话 ...

  3. Shiro结合Redis解决集群中session同步问题

    Shiro结合Redis解决集群中session同步问题 参考文章: (1)Shiro结合Redis解决集群中session同步问题 (2)https://www.cnblogs.com/Luke-M ...

  4. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  5. jsp中session 失效设置

    jsp中session 失效设置 一般web系统都需要控制session自动失效的时间,从而控制用户访问系统超时.设置session失效有以下三种方式: 1.在主页面或者公共页面中加入:session ...

  6. legend3---4、lavarel中session使用注意

    legend3---4.lavarel中session使用注意 一.总结 一句话总结: session('key',$value)不是存值,是设置默认值,session(['key'=>$val ...

  7. Spring MVC中Session的正确用法之我见02

    Spring MVC中Session的正确用法之我见 Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置 ...

  8. php 中session与cookies的区别,php中session和cookie的区别

    php中session和cookie的区别 本文较为详细的比较了php中session与cookie区别.分享给大家供大家参考.具体分析如下: 1.存放的位置 cookie保存在客户端,session ...

  9. Session的原理,大型网站中Session方面应注意什么?

    一.Session和Cookie的区别 Session是在服务器端保持会话数据的一种方法(通常用于pc端网站保持登录状态,手机端通常会使用token方式实现),存储在服务端. Cookie是在客户端保 ...

最新文章

  1. Hlink的Analysis基本搞定了
  2. 框架:HTTP请求的表单提交的几种方式
  3. Python基础--线程
  4. 套接字设置为(非)阻塞模式
  5. 求 LCA 的三种方法
  6. php怎么调用dll例子,php调用dll的实例操作动画与代码分享_PHP教程
  7. 爬取100页京东商品评论
  8. python基础系列教程——Python3.x标准模块库目录
  9. 概率论与环境数理统计 20210222
  10. 数据库原理与应用第三版何玉洁第二章课后题答案
  11. 实用工具 - 小众软件
  12. 计算机应用 网络管理开发,基于XML的iBAC网络管理系统的研究与开发-计算机应用技术专业论文.docx...
  13. SATA 3.0 双通道 - 硬盘数据线 + 硬盘电源线
  14. 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径, 使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
  15. Linux怎么完全删除一个用户
  16. 数仓模型设计详细讲解
  17. 计算机考试准考证没有照片
  18. 云效·Insight(效能洞察)一款面向企业研发管理层的研发效能数字化度量服务
  19. 达内学员就业率远超名校大学生就业率
  20. TypeScript由浅到深

热门文章

  1. 软件工程课设-----日程管理系统
  2. STM32f4 ARM Bootloader
  3. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
  4. 利用 Docker 搭建单机的 Cloudera CDH 以及使用实践
  5. 误删docker0网桥之后怎么办呢?
  6. 阿里云天池 金融风控训练营Task1 广东工业站
  7. 记一次打包的诡异现象
  8. [转]在ROS下使用zeroconf配置多机通信
  9. SharePoint 2010-随机出现的页面性能问题
  10. android webView的缓存机制和资源预加载