您的位置:首页 > 运维架构

从0开始学习quantum之3:实现WSGI的第三方库

2013-07-31 23:40 585 查看
一、Eventlet:

eventlet实现了WSGI的的server,我们只需要实现app,配合eventlet就可以完整地实现WSGI协议

如下就是一个利用eventlet做server,我们自己写APP实现WSGI的例子。

from eventlet import api,wsgi

def webapp(environ,start_respon):
start_respon('200 OK',[('Content-Type','text/plain')])
return ['this is songyixiong wsgi app']

wsgi.server(api.tcp_listener(('',8000)),webapp)

 

运行程序后从浏览器输入地址http://localhost:8000/,浏览器界面则返回this is songyixiong wsgi app

肿么样?简单吧?这是一个最简单的wsgi的例子了,eventlet封装了environ和start_response,而我们则实现了app,接受environ和start_response。在environ中有server收到的http请求,我这里没有做处理,直接返回一个结果了。

可以看到,webapp的返回值就是要在网页上显式的内容,而调用start_response告诉浏览器结果是怎么样的,以及告诉浏览器用什么方式解释返回的结果。

 

二、webob

 

三、routes

routes,是一个匹配URL及其处理方法的第三方库

routes中有一个类型Mapper,用户可以事先在Mapper中保存url对应的处理集合dict,url和dict构成了一个键值对

{
url1:dict1
url2:dict2
...

}

当给mapper一个url时,mapper则根据保存的键值对找出最先匹配的dict,用这个dict来处理

#coding:UTF-8
from routes import Mapper
map = Mapper()
map.connect('mapName', '/sample', methodContainer='sampleContainer', methodName='sampleMethod')
map.connect('/cba',methodContainer='ccc', methodName='ccca')

result = map.match('/sample')
print result

result = map.match('/abc')
print result

result = map.match('/cba')
print result

输出结果
{'methodContainer': u'sampleContainer', 'methodName': u'sampleMethod'}
None
{'methodContainer': u'ccc', 'methodName': u'ccca'}
map.connect方法就是用户保存的映射关系,在上例中,保存了url分别为'sample'和'abc'的映射,当用户传入一个url时,就返回映射的值,这个值是一个dict。

我们来看看map.connect的原形:

connect(self, *args, **kargs),只有2个可变参数,因此我们在调用它的时候,用‘=’连接的实参将会组成一个dict作为映射的value放置在mapper中。而不用'='的实参则如果有多个则以第2个作为key保存在mapper中,否则以第一个参数作为key保存在mapper中。

map.connect('mapName', '/sample', methodContainer='sampleContainer', methodName='sampleMethod')

map.connect('/abc', '/cba',methodContainer='ccc', methodName='ccca')

在mapper中保存为

{

'/sample':{'methodContainer':'sampleContainer','methodName':'sampleMethod'}

'/cba':{'methodContainer': 'ccc', 'methodName': 'ccca'}



用户根据url从mapper中取出dict后,根据需要做后续处理。

然而,调用connect保存url映射时,可变参数2的存在一些内置字段,可以使得匹配规则根据丰富

 conditions字段是mapper的内置字段,URL匹配时会根据condition设置的值作为过滤条件 

mapper.connect("/myurl",  xxmethod=response, conditions=dict(method=["GET"]))  
这里mapper只能匹配url是‘myurl’且http请求是GET类型的URL。

connet方法还有很多用法例如支持url的正则表达式匹配。

更多高级特性请使用help命令查看或查看官方文档。

        m = Mapper()

        m.connect(':controller/:action/:id')

        m.connect('date/:year/:month/:day', controller="blog", action="view")

        m.connect('archives/:page', controller="blog", action="by_page",

        requirements = { 'page':'\d{1,2}' })

        m.connect('category_list', 'archives/category/:section', controller='blog', action='category',

        section='home', type='list')

        m.connect('home', '', controller='blog', action='view', section='home')

除了mapper.connect方法之外,还有一个mapper.collection方法

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