webpy源码分析(三): application的wsgifunc()

wsgifunc在调用handle_with_processors之前为APP的执行进行了上下文的准备,主要预处理了HTTP请求及相关环境变量

环境变量的存储

123.png

每个http请求是在一个线程中处理的,为了避免冲突,每个线程都有自己的存放上下文数据(主要为HTTP请求)的地方,即这里的ThreadedDict。他继承自threadlocal,其定义如下:

from threading import local as threadlocal

每个ThreadedDict对象只有定义他的线程可见,注意作者为ThreadedDict写的docstring中的例子。
ThreadedDict有个类成员_instances,其保存了所有ThreadedDict实例,方便进行统一清理,请注意其方法__init__()、__del__以及clear_all()的实现。
既然所有的数据都通过ThreadedDict保存,那ThreadedDict的clear_all()也就意味着清理所有线程中的上下文数据。
由于所有线程都会被回收再利用,在处理HTTP请求前后分别进行一次清理工作是一种保险的做法,毕竟你不能确保application.py的第325行代码每次都被正常执行,下层很有可能在处理result中的前序元素过程中因为某些原因出现异常而终止处理后续result中的内容。

环境变量的内容

123.png

application的load()方法对http请求进行预处理,并将其以ThreadedDict形式存储在线程中。
load函数比较繁琐,但是逻辑相对简单,为了理解其处理过程,我将参数env和处理后的ctx都打印出来。

URL为

http://xxx.xxx.xxx.56:8080/hello?arg=1&arg_chs=中文

使用的是chrome浏览器

参数env的内容如下:

123.png

红色部分应该是cheroot写入的内容

对应的load()处理后的ctx内容如下:

123.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容