使用Tornado自定义Session组件
最近又看了看tornado框架,写了一个自定义的组件。一直没时间上传,今天终于可以和大家见面了,对了,大家在和本文亲密之前需要先预热一下哦~:stuck_out_tongue::stuck_out_tongue::stuck_out_tongue:
Tornado的自定义session组件
1. session会话技术
既然咱们要说一说session,那么必然要知道session是什么,接下来让我们一同了解一下session吧!
- Session 是服务器保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中
Cookie 是客户端保存用户信息的一个机制,用来记录用户的一些信息,也是实现Session的一个方式,存储在用户的浏览器中
2. 自定义session原理解析
我们先来看看tornado的基础程序
1 | # -*- coding:UTF-8 -*- |
我们会发现当请求来的时候,就会调用get()方法,那么大家想一下,这个get()方法的调用是不是需要MainHandler对象来调用,如果没有对象,MainHandler里面的get()根本就调用不了,
所以肯定是要先创建对象,要创建对象那么一定要执行
__init__()
方法,然而我们没有写__init__()
方法,那怎么办呢,这时候我们准备的知识点就用到啦,需要到父类中去查找,也就是RequestHandler类的__init__()
,- 我们可以看到RequestHandler类的
__init__()
,也就是说,在调用这个get()方法之前肯定要调用__init__()
方法,也就是说只要在__init__()
方法中写入的东西都是get()或者post()方法之前的。 我们可以发现在
__init__()
方法的最后调用了self.initialize(**kwargs)
然而,这个方法什么都没写,也就是给我们预留的添加自己的操作的方法,我们将从这里入手通过继承的机制我们可以知道要向给handler添加自己的东西,有两种写法
1 | 第一种:多继承 |
因为Python是支持多继承的,所以我们将以多继承的这种方式进行解析
- 我们模拟Django的session来说,登录账号之后,session就自动的帮我们写到了服务器上了,我们要开源这个组件就需要让用户感知起来非常的方便,所以,我们以后就想让用户这样写
1 | self.session['xxx'] = 'dfdafdasfd' |
所以我们需要做这些事情,而且我们需要【】这样取值,我们首先想到的类型就是字典,没错,字典是这样取值,但是我们提前的知识点可不是白学的呦,使用
__setitem__()
魔法方法就可以呦,为了后面的额步骤,我们选择可以使用类。- 生成随机字符串
- 写到用户cookie
- 后台存储
大家应该还记得MainHandler里面有self.set_cookie()函数,我们需要使用这个函数将session_id 写入cookie中,然而Foo类中的self就是MainHandler对象,所以我们只需要将self传入Bar就可以了
将session写入数据库,我们先使用一个字典充当数据库
3. 写自定义的session代码
- 我们按照我们分析的原理将代码写出来
1 | # -*- coding:UTF-8 -*- |
4. 存储session
- 我们将session放到了一个字典里,只是放到了内存里,然而我们不想放内存里怎么办呢?为了提高用户的需求的灵活性,我们可以将存储使用类实现,使其可以放入缓存,内存,数据库等你想放的地方
1 | # -*- coding:UTF-8 -*- |
- 这样我们的自定义session会话就完成啦,快快使用一下吧!:yum:
有什么不正确的地方欢迎指点哟!:kissing_heart:
邮箱:cyss428@163.com