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

你可能感兴趣的:(webpy源码分析(三): application的wsgifunc())