python WSGI中loadapp源码分析

WSGI是python网络标准,这篇文章主要将分析WSGI中一个重要的函数——loadapp,此函数用户构建application。

直接放一个代码结构图,我用百度脑图画的,由于太大了,直接放图片看不清,所以这里大家可以直接打开对比百度脑图看http://naotu.baidu.com/file/4469a9697fb99850f63784ff56a15bde?token=88752f72859e855a

因为ini文件的写法不一样,代码执行过程也有一定的差异,这里我以keystone启动为例,详细说明WSGI中loadapp的过程。调试过程请自行对照脑图,图中部分节点有备注说明,图中等级相同的节点可以看做不同时候调用的同一个函数。

首先是loadobj函数,这个函数可以分为两部分,一部分是构建context,一部分是create,可自行对照脑图。

构建context:

调用loadcontext进入,主要两个功能,如下图,解析配置文件路径和调用_loadconfig

解析路径不用多说,继续下面, _loadconfig函数存放在一个列表中,除了这个load函数外还有另外两个,一个加载egg,一个加载call,用到再说。_loadconfig函数又分为三部分,如下图所示

同样解析路径不说,然后是ConfigLoader,这里主要完成ini配置文件的读取,也比较简单,最后就是get_context, 如下图所示:

get_context也是三个部分,首先根据传入的name在ini配置文件中找到程序主入口,在keystone中主入口为[composite:main],根据传入的name=main找到;然后将主入口下的所有项的提取出来放入local_conf中,比如keystone的配置文件中就是如下这些:

[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/v3 = api_v3
/ = public_version_api

最后就是根据当前项的类型进行处理,分为app-filter、pipeline,以及除了这两个之外的,一般就是app和composite,而这app和composite又以是否使用use来区分,这点和paste配置文件的写法有关,一般paste文件可以写成以下两种:

直接变量名=路径形式

使用use形式

如果是使用use形式则egg后面的报名必须要有相应的信息目录,比如keystone的

根据信息目录中的entry_points文件才能具体定位到相应的工厂函数,下面是keystone的示例

以keystone为例的话,主入口就是composite类型,一般这种类型都会使用use = egg:Paste#urlmap包,用于下面项的路由,所以这里就是进入_context_from_use,如下图

同样进去之后先解析uri,这里就是use = egg:Paste#urlmap这条,从图中我标注的等级可以看出,这里又和前面等级2一样了,只是这里就是我前面所说的调用_loadegg了,前面是_loadconfig,进入_loadegg,代码结构如下

这个函数主要功能就是根据egg后面包的信息目录来获取这个包的信息,其中EggLoader只是建立一个对象,用于存储后面解析的信息,而get_context中最重要的就是find_egg_entry_point,这个函数首先获取包的具体信息,然后调用entry.load加载这个包。

context.create:

这里将会依次对主入口下的除了urlmap外的每一项都构建

首先创建一个URLMap的实例,然后对下面每一项执行loader.get_app,而下面的每一项又是一个get_context加create的过程

从图中标注的等级关系可以看出,这又是和之前相同的过程

从图中可知,其它过程都相同,只是在等级6处进入了pipeline,然后又是三个部分,首先也是创建一个对象,然后构建pipeline中的最后一个app,最后在依次加载pipeline中的所有filter,下面以app的加载为例,filter过程相同,可以自行跟踪。

构建app时也是先解析uri,然后根据paste配置为文件app项的不同写法,use型和直接型,如果use型就和上面说的一样,如果是直接性,就是这里的_context_from_explicit,

具体过程和use型差不多,目的都是为了加载相关工厂函数。

所有工厂函数加载完成之后,进入最后一步create:

这步就是根据加载的工厂函数,从pipeline的最后一个app开始,从后往前依次构造app,后一个app将作为前一个app构造的参数,最后就完成application的创建,返回一个urlmap对象。当请求到达时,便从urlmap开始依次处理。

大致过程是这样的,读者也可以自行写一个wsgi的程序调试一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值