tornado自定义的session

写在前面:

tornado竟然没有内置的session,当初刚知道时我竟是一脸懵逼。比起flask有很多别人写好的组件, tornado组件少得可怜,都要靠开发者自己撸,有人挺喜欢这种DIY的感觉,而我,是一个小菜鸡,面对这种情况只能敢怒不敢言,在心里骂娘。

 

别人写好的session.py  原理我倒是懂,硬写也能写出来吧,嗯,还是拿来主义最好了。

session.py

import hashlib
import time

ALL_USER_DIC = {}


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

    def __get_random_str(self):
        # 生成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)

app.py(叫什么无所谓了)

import tornado.web
from session import Session
import tornado.ioloop


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


class IndexHandler(BaseHandler):
    def get(self):
        self.render("a.html")

    def post(self, *args, **kwargs):
        if self.get_argument('name', None) == '123':
            self.session['is_login'] = True
            self.session['name'] = self.get_argument('name')
            self.redirect('/admin')
        else:
            self.write('登录失败, 请重新登录!')


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


settings = {
    "cookie_secret": 'test-secret,',
    'template_path': 'template',
}

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


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

 

需要注意的是要重写initialize, initialize是留下的钩子函数,会在整体之前执行, 类似django的中间吧

写入session, 后面的类不再继承 tornado.web.RequestHandler, 而是继承重写initialize的那个类。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值