自定义的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

相关文章

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.