您的位置:首页 > 编程语言 > Python开发

webpy源码阅读

2015-11-12 21:31 736 查看
转载自:http://my.oschina.net/u/138488/blog/169092

2 找到源码分析的切入点, 以下是webpy官网提供的helloworld程序代码

?
很明显 application.run()就是程序的启动入口了。打开application.py看代码果然很多,不过飘过其他的代码先不看找到run()函数其代码为:

?
好吧它又调转到了wsgi.py的runwsgi()函数了其代码为(该代码可以基本飘过只看最后一行)

?
上面这段代码主要的意思就是通过传人的命令行参数进行不同的初始化,最后传人到httpservice.runsimple()函数了 并且将启动的application(func)也传了进去一下为httpservice.runsimple()源码:

?
看到这段代码我就豁然开朗了原理8080端口默认是在这里啊!

再看下面的代码

func = StaticMiddleware(func)

func = LogMiddleware(func)

它们分别是加入了两个路由第一个是我们静态资源文件夹路由"/static/",另外一个是日志路由(所谓路由可以理解为一个拦截器,路由拦截自定url路径的数据)不明白的话还是看代码比较清楚 以StaticMiddleware为例他们都在httpservice.py文件中

?
这个地方其实挺关键因为webpy的application本身也可以理解为一个路由(这样你也就可以路径application中其实还可以添加下一层application了)webpy使用子应用http://webpy.org/cookbook/subapp.zh-cn

读到这里你可能会有点不明白了 def __call__(self, environ, start_response):这传入的两个参数 environ, start_response是怎么来的?有什么意义?

其实这是python的wsgi协议里面定义的东东了你可以通过这篇文章了解wsgi的部分知识http://linluxiang.iteye.com/blog/799163

如果你看明白了wsgi的知识也就自然明白了runsimple()函数中server.start()是个什么了,它其实就是启动wsgiserver服务

通过以上的学习你就可以写自己的路由了(仿照StaticMiddleware哦),其实webpy在application.run()就定义了路由接口,开发者可以写自己的路由然后传人run()函数 启动的时候会一步一步的传递到wgsi中。如下代码

?
我们在运用webpy时有两个特性可能注意到了,一个是子应用(在上一篇文章已经提及到),另外是"应用处理器"和“钩子”Wbepy-coobook资料里面提及到钩子的使用方法,我们可以先明白它们的使用方法后面一步一步分析其实现原理。

首先我们进入appliction.py的 def __init__(self, mapping=(), fvars={}, autoreload=None):方法webpy初始化就基本从这里开始了

?
通过以上源码注释下的两行代码与钩子的使用方法比较可以看出它们是一样的,所以我们可以把"钩子"归一到"应用处理器"。

这里我们可以猜想到webpy里面很大一部分功能可能都是通过"processor"实现的,实际上在分析以下session.py代码以后就可以发现web.py的session处理就是通过加入一个processor实现的。processor可以理解为一个处理链条当请求到来时一步一步通过这个链条里面的processor处理。

下一步我们来了解当请求到来是webpy的执行过程,通过上一篇文章了解我们可以确定webpy其实是一个wsgi应用,webpy通过application.py 的run方法启动wsgi服务,并且传人自己的处理函数以供wsgi在有请求是回调处理。

?
通过以上代码可以确定回调函数就是从 self.wsgifunc(*middleware) 函数中取得的

?
分析以上代码 请求到来时将首先执行 def wsgifunc(self, *middleware):函数中def wsgi(env, start_resp):函数的代码,def wsgi(env, start_resp):又调用appliction.py的def handle_with_processors(self):函数递归调用执行"processors"的代码。

?
如此完整的请求执行链条便基本完成了。

通过以上代码分析如果processors被递归执行完毕以后便执行self.handle()函数代码如下

?
_match函数对匹配用户的url与我们配置的urls进行匹配查找正确的url处理函数。然后调用_delegate函数去执行

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python