Tornado框架05-session

我们将许多信息放在cookie中势必会造成浏览器端的臃肿, 此时便需要在服务端保存原本在浏览器端的那些键值对. 在浏览器端只需存储一个表示身份的随机加密字符串, 当浏览器端访问服务端时候携带该字符串, 经过比较, 验证合法之后便可以取该用户在服务端存储的相应信息. 但是在Tornado中并没有session的模块, 我们需要自定义来实现.

项目目录

**all.py文件如下: **

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

# 存储所有的用户信息
ALL_USER_DIC = {}

**base.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web
from commons.session import Session


class BaseHandler(tornado.web.RequestHandler):
    # 钩子函数, 子类初始化时候会将子类对象传入该方法中执行
    def initialize(self):
        # 这里将子类对象传入session中, 则以后生成的session对象中就包含处理器的实例对象
        self.session = Session(self)

**session.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from commons.all import ALL_USER_DIC


class Session:
    def __init__(self, handler):
        self.handler = handler
        self.random_index_str = None

    def __get_random_str(self):
        import hashlib, time
        # 生成md5对象
        md = hashlib.md5()

        # 加入自定义参数来更新md5对象
        md.update(bytes(str(time.time()) + ' | own-secret', encoding='utf-8'))

        # 得到加盐后的十六进制随机字符串来作为用户的索引
        return md.hexdigest()

    def __setitem__(self, key, value):
        # 当前session对象中没有对应的索引的时候
        if not self.random_index_str:
            # 根据处理器对象获得浏览器传来的cookie的值
            random_index_str = self.handler.get_secure_cookie("__sson__", None)

            # 浏览器传来的cookie的值为空的时候, 表示该用户是第一次访问本网站
            if not random_index_str:
                # 为当前的新用户在当前的session对象中生成索引
                self.random_index_str = self.__get_random_str()
                # 为当前新用户设置cookie
                self.handler.set_secure_cookie('__sson__', self.random_index_str)
                # 为当前用户生成保存其相关内容的字典对象
                ALL_USER_DIC[self.random_index_str] = {}

            # 当浏览器传来的cookie不为空的时候
            else:
                # 浏览器传来的cookie非法的时候
                if self.random_index_str not in ALL_USER_DIC.keys():
                    # 为当前非法用户生产索引
                    self.random_index_str = self.__get_random_str()
                    # 仅仅为当前非法用户生成其保存相关内容的字典对象, 避免合法老用户的字典对象被清空
                    ALL_USER_DIC[self.random_index_str] = {}

        # 不管当前session对象有没有对应的索引都应该为他设置起相关的信息保存(当然了, 到这一步的时候经过if条件语句的过滤, 剩下来的就是刚刚创建字典对象的新用户或者非法用户, 以及其他合法的老用户了)
        ALL_USER_DIC[self.random_index_str][key] = value

        # 将为以上的新用户或者非法用户设置cookie的操作放在这里本无可厚非. 但是将老用户的cookie也重新设置一遍, 其实是为老用户更新过期时间而做的
        self.handler.set_secure_cookie('__sson__', self.random_index_str)

    def __getitem__(self, key):
        # 获取当前用户cookie中保存的索引值, 注意加密方式返回的cookie的值是bytes类型的
        self.random_index_str = self.handler.get_secure_cookie('__sson__', None)
        # 若索引值为空表示当前用户是新用户, 则直接返回空, 程序到此终止
        if not self.random_index_str:
            return None

        # 索引不为空的时候
        else:
            self.random_index_str = str(self.random_index_str, encoding="utf-8")
            # 在服务器端为保存该索引值表示当前用户是非法用户,则直接返回空
            current_user = ALL_USER_DIC.get(self.random_index_str, None)
            if not current_user:
                return None
            else:
                # 直接返回合法用户指定的key的值, 没有则默认返回空
                return current_user.get(key, None)

**home.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web
from commons.base import BaseHandler


class IndexHandler(BaseHandler):
    def get(self):
        if self.get_argument('name', None) == 'test':
            self.session['is_login'] = True
            self.session['name'] = self.get_argument('name')
        else:
            self.write('登录失败, 请重新登录!')


class AdminHandler(BaseHandler):
    def get(self):
        if self.session['is_login']:
            self.write('欢迎%s回来. ' % (self.session['name'],))
        else:
            self.redirect('/index')

**start.py文件如下: **

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web, tornado.ioloop
from controllers import home

if __name__ == '__main__':
    settings = {
        # 模板路径配置
        'template_path': 'views',
        "cookie_secret": 'test-secret,'
    }

    application = tornado.web.Application([
        (r"/index", home.IndexHandler),
        (r"/admin", home.AdminHandler),
    ], **settings)
    application.listen(80)
    tornado.ioloop.IOLoop.instance().start()
运行结果-1
运行结果-2
  • 至此我们就完成了基于加密cookie方式的session服务端验证
  • 注意, 获取加密方式的cookie的值是bytes类型的, 一定要记得转成str类型, 否则用bytes去找str类型是无法匹配成功, 直接会造成即使登录成功, 也无法访问到admin成功的页面(笔者就曾掉进此坑了挣扎好久)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,152评论 3 82
  • 作者:晚晴幽草轩www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饥人谷_Dylan阅读 1,208评论 0 51
  • 不知道做门店的朋友有没有这样的经历,明明自己的门店的销售销量还不错,利润还可以,但是一个月下来利润却并不是很理想这...
    骑猪去卖货阅读 193评论 0 0
  • 我终于发现为什么很多人推荐年轻人去看一些名人的传记了,是想让年轻人学习他们的精神,学习他们品德,学习他们做人做事的...
    一直走别回头M阅读 422评论 0 0