python全栈系列之---定义一个session类

首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型

            #self.get_secure_cookie()
            #The decoded cookie value is returned as a byte string (unlike
            #`get_cookie`).

md5加密获取的十六进制也是返回的字符串类型

        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
        random_str = obj.hexdigest()#返回字符串
        """ Return the digest value as a string of hexadecimal digits. """

以下是自定义的session类,以及使用:

import tornado.web

#放在内存 redis  文件  数据库
container={}

#定义一个session类
class Session:
    def __init__(self,handler):
        self.handler=handler
        pass

    def __genarate_random_str(self):
        import hashlib
        import time
        obj = hashlib.md5()
        obj.update(bytes(str(time.time()), encoding="utf8"))#传入byte类型
        random_str = obj.hexdigest()#返回字符串
        return random_str

    def set_value(self,key,value):
        #在container中加入随机字符串
        #加入自定义数据
        #在客户端中写入随机字符串
        random_str=‘‘
        if self.handler.get_cookie(‘py_session‘):
            random_str=self.handler.get_cookie(‘py_session‘)
            if not container.get(random_str,None):
                random_str = self.__genarate_random_str()
        else:
            random_str=self.__genarate_random_str()
        if not container.get(random_str,None):
            container[random_str]={}
        container[random_str][key]=value
        #加入客户端
        self.handler.set_cookie(‘py_session‘,random_str)

    def get_value(self,key):
        #先去获取客户端的随机字符串
        #从container中获取自定义数据
        random_str=self.handler.get_cookie(‘py_session‘,None)
        dict_info=container.get(random_str,None)
        if not dict_info:
            return None
        return dict_info[key]

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        if self.get_argument(‘u‘,None) in [‘asd‘,‘zxc‘]:
            s = Session(self)
            s.set_value(‘is_login‘,True)
            #self.get_secure_cookie()
            #The decoded cookie value is returned as a byte string (unlike
            #`get_cookie`).

        else:
            self.write("请登录")

class ManagerHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        s=Session(self)
        val = s.get_value(‘is_login‘)
        if val:
            self.write("登录成功")
        else:
            self.redirect("/index")

settings ={
    ‘template_path‘:‘views‘,
    ‘static_path‘:‘statics‘,
    ‘cookie_secret‘:‘dafawafawfaw‘,
}

application = tornado.web.Application([
    (r"/index",IndexHandler),
    (r"/manager",ManagerHandler),
],**settings)

原文地址:https://www.cnblogs.com/ssyfj/p/8527687.html

时间: 2024-10-14 15:46:40

python全栈系列之---定义一个session类的相关文章

python全栈系列之---cookie模拟登陆和模拟session原理

cookie模拟登陆: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self): #self.write("Hello world") # 展示所有的cookie # print(self.cookies) # print(self.get_cookie('k1')) # self.set_cookie('k1','999')#还有 过期时间 适用路径 # self.render(

python全栈系列之---xss跨站脚本攻击和csrf(xsrf)攻击

xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而不对用户的输入数据进行检测,直接显示在页面中. 若是用户输入了某些css样式代码,html表格代码,显示在页面后会改变页面的布局. 若是输入某些js代码,用于获取其他用户的文件,或者修改本地文件,也可以发送用户cookie等信息到自己的计算机中模拟用户登录 一般可以通过函数处理htmlspecial

python全栈系列之---自定义分页类

# coding:utf8 # __author: Administrator # date: 2018/3/7 0007 # /usr/bin/env python import tornado.web from math import ceil LIST_INFO =[ {'username':'ld',"email":'[email protected]'}, ] class Pagination: #传入当前页,总条数 def __init__(self,current_pag

Python全栈之路----面向对象开发----元类介绍

储备知识exec,可以被当作函数来看待. 参数1:字符串形式的命令 参数2:全局作用域(字典形式),如果不指定默认就使用globals() 参数3:局部作用域(字典形式),如果不指定默认就使用locals() g = {'x':1, 'y':2} l = {} exec(''' global x,m x = 10 m = 100 z = 3 ''', g, l) python中一切皆对象,对象可以怎么用? 1.都可以被引用,x = obj 2.都可以当作函数的参数传入 3.都可以当作函数的返回值

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000

Python全栈之路系列----之-----面向对象

面向对象基本介绍 python编程方式: 面向过程编程  (流水线式思维) 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 面向函数编程 封装代码,简化流程 但是本质上没有改变结果   是面向结果编程思想 面向对象编程 优点是:解决了程序的扩展性.对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易. 缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用