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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python WSGIPython Web服务器网关接口的缩写,它是一种用于连接Web服务器和Python应用程序的规范。WSGI允许开发人员使用统一的接口来开发Web应用程序,无论使用哪种Web服务器。WSGI通过定义一组规则和约定,使得编写Web应用程序变得更加简单和可扩展。 在Python,可以使用uWSGI作为基于WSGI协议的功能强大的Web服务器,同时也支持Python WSGI协议。uWSGI性能很好,但配置相对复杂。 通常,一个WSGI应用程序由一个可调用的对象组成,该对象接收两个参数,分别是environ和start_response。environ包含与请求相关的环境变量,而start_response是一个用于发送响应头的函数。通过调用start_response函数,应用程序可以发送响应状态码和响应头给Web服务器,然后将返回的数据作为可迭代对象返回给Web服务器。 当Web服务器收到请求时,它将环境变量和回调函数传递给WSGI应用程序,应用程序处理请求并生成响应。然后,Web服务器将响应返回给客户端。这种方式可以使不同的Web服务器与不同的应用程序框架进行交互,实现了服务器和应用程序的解耦。[2, 3] 总结来说,Python WSGI是一种连接Web服务器和Python应用程序的规范,它提供了一种统一的接口来开发Web应用程序。uWSGI是一个基于WSGI协议的强大的Web服务器。通过WSGI,可以实现Web服务器和应用程序的解耦,使得开发和部署Web应用程序变得更加灵活和可扩展。[1, 2, 3]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python基础入门教程:WSGI](https://blog.csdn.net/weixin_33798152/article/details/91396901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python WSGI的深入理解](https://download.csdn.net/download/weixin_38746515/14869908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值