自定义的tornado session,包含程序注释,直接可用

2024-03-19 22:32

本文主要是介绍自定义的tornado session,包含程序注释,直接可用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# coding:utf8
import tornado.web
import os
import jsonimport time
import hashlib"""
程序初始化操作有些什么?自动执行了以下过程:
在输入login的时候显示login界面,点击提交到了loginserviceHandler方法,接下来自动执行一些东西。说明如下:
LoginserviceHandler继承了Foo类,Foo中有initialize方法,initialize方法会被自动执行。
(原因:查看tornado.web.RequestHandler源码,_init_方法的时候就会调用initialize方法)更具体的流程如下:
LoginserviceHandler一执行,调用_init_方法, _init_方法调用Foo类里面的initialize方法,这时实例化Session(),
self.session = Session(self),然后Session()在初始化的时候执行__init__方法,即( #session初始化方法那里)。
然后实例化CacheMethod()类,self.cacheclass = CacheMethod()
然后获取浏览器的cookie,self.handler.get_cookie('my_session_id'),进行判断。"""container = {}class Cache(object):def __init__(self):# self.container = {}passdef __contains__(self, item):return item in containerdef initial(self,random_str):container[random_str] = {}def get(self,random_str,key):return container[random_str].get(key)def set(self,random_str,key,value):# self.addtwodimdict(container,random_str,key,value)container[random_str][key] = valuedef showall(self):return containerdef delete(self,random_str,key):del container[random_str][key]def open(self):passdef close(self):passdef clear(self,random_str):print("cache里面的clear")del container[random_str]def addtwodimdict(self,thedict,key_a,key_b,val):#二维字典的赋值方式,但其实不用这么做,实际上程序也没有用这个函数if key_a in thedict:thedict[key_a].update({key_b: val})else:thedict.update({key_a: {key_b: val}})class Memcache(object):def __init__(self):passdef get(self,key):passdef set(self,key,value):passdef delete(self,key):passdef showall(self):passdef open(self):passdef close(self):passclass Filecache(object):def __init__(self):passdef get(self,key):passdef set(self,key,value):passdef delete(self,key):passdef showall(self):passdef open(self):passdef close(self):passCacheMethod = Cache
#这里根据需求改变存储的方式,自己写方法。cache是我写好的,file,redis,memcache等class Session(object):def __init__(self,handler):#session初始化方法print("sesson init")self.handler = handlerself.random_str = Noneself.cacheclass = CacheMethod()#实例化存储的方法,这个方法可以自定义了。file,redis,memcache,自己写方法# 去用户请求信息中获取my_session_id,如果没有,新用户client_random_str = self.handler.get_cookie('my_session_id')if not client_random_str:"新用户"self.random_str = self.create_random_str()self.cacheclass.initial(self.random_str)print("新用户")# print(container)print(self.showall())#这个self.showall()是Session()函数的,然后再在里面调用cache()的showall()else:if client_random_str in self.cacheclass:#这里会调用cacheclass中的__contains__方法,其中item就是client_random_str,这是python魔术方法#这样做的好处是,让这Session类只做参数传递,具体的参数操作和参数名是什么,可以由开发人员在存储方式中定义,即cache,redis"老用户"self.random_str = client_random_strprint("老用户")# print(container)print(self.showall())else:"非法用户"self.random_str = self.create_random_str()self.cacheclass.initial(self.random_str)print("非法用户")# print(container)print(self.showall())ctime = time.time()self.handler.set_cookie('my_session_id',self.random_str,expires=ctime+1800)def __setitem__(self, key, value):self.cacheclass.set(self.random_str,key,value)print("__setitem__")def __getitem__(self, key):print("__getitem__")v = self.cacheclass.get(self.random_str,key)return vdef __delitem__(self, key):self.cacheclass.delete(self.random_str,key)print("__delitem__")def clear(self):print("Session里面的clear")self.cacheclass.clear(self.random_str)def showall(self):return self.cacheclass.showall()def create_random_str(self):v = str(time.time())m = hashlib.md5()m.update(bytes(v))return m.hexdigest()class Foo(object):def initialize(self):# self是MainHandler对象print("foo initialize")self.session = Session(self)#在其他类中调用session的方法提供的实例化对象为self.sessionsuper(Foo,self).initialize()#super不仅找父类,Foo继承的是object类,那么说明Foo这条线已经继承完,开始第二条线继承tornado.web.RequesHandlerclass HomeHandler(Foo,tornado.web.RequestHandler):def get(self):user = self.session['user']if not user:self.redirect("login")else:self.write(user)# print(container)print(self.session.showall())class LoginHandler(tornado.web.RequestHandler):def get(self, *args, **kwargs):self.render('views/login.html')print(container)# print(self.container)class LoginserviceHandler(Foo,tornado.web.RequestHandler):def get(self, *args, **kwargs):user = self.get_argument("user")pwd = self.get_argument("pwd")if(user == "user"):self.session['user'] = userself.session['pwd'] = pwdprint("用户名正确")self.redirect('/home')else:print("用户名错误")self.redirect('/login')class ClearHandler(Foo,tornado.web.RequestHandler):def get(self,*args,**kwargs):del self.session['user']#首先调用Foo中initialize_然后实例化Session(),并调用__init__,其中del又会调用__delitem__操作class ClearallHandler(Foo,tornado.web.RequestHandler):def get(self):self.session.clear()#首先调用Foo中initialize方法_然后实例化Session()为self.session。再调用其中的clear()方法self.write("clearall")class ShowHandler(Foo,tornado.web.RequestHandler):def get(self):# self.write(container)self.write(self.session.showall())#首先调用Foo中initialize方法_然后实例化Session()为self.session。再调用其中的showall()方法class DemoHandler(tornado.web.RequestHandler):def get(self):self.write("demo")temp = self.create_random_str()self.write(temp)def create_random_str(self):v = str(time.time())m = hashlib.md5()m.update(bytes(v))return m.hexdigest()application = tornado.web.Application([(r"/login", LoginHandler),(r"/loginservice", LoginserviceHandler),(r"/home", HomeHandler),(r"/clear", ClearHandler),(r"/clearall", ClearallHandler),(r"/show", ShowHandler),(r"/", DemoHandler),
])if __name__ == "__main__":application.listen(9999)tornado.ioloop.IOLoop.instance().start()

这篇关于自定义的tornado session,包含程序注释,直接可用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827438

相关文章

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束