从0开始学习quantum之3:实现WSGI的第三方库
2013-07-31 23:40
585 查看
一、Eventlet:
eventlet实现了WSGI的的server,我们只需要实现app,配合eventlet就可以完整地实现WSGI协议
如下就是一个利用eventlet做server,我们自己写APP实现WSGI的例子。
运行程序后从浏览器输入地址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来处理
我们来看看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设置的值作为过滤条件
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方法
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方法
相关文章推荐
- 从0开始学习quantum之2:WSGI协议
- iOS 学习笔记 十三 (2015.04.15)采用第三方库,实现ios录音转为amr
- iOS学习笔记--01swift实现提示框第三方库:MBProgressHUD
- iOS学习笔记--01swift实现提示框第三方库:MBProgressHUD
- 从0开始学习quantum之0----背景知识
- swift2.0学习笔记之使用第三方库KGFloatingDrawer实现抽屉
- iOS学习笔记55- iOS项目集成ShareSDK实现第三方登录、分享、关注等功能。
- 不使用第三方 SDK 实现简单分享 -- Android 学习之路
- webService学习-调用第三方提供的webService服务实现获取天气预报信息
- 从0开始学习contiki之01搭建编译环境实现hello world
- 猫猫学习ios 之第三方登录友盟实现
- 学习日记--Android第三方异步网路加载库AsyncHttpClient内部实现
- json学习初体验--使用第三方的jar包实现bean、List、map创建json格式
- JDO学习笔记之Sun JDO参考实现篇
- 一步步学习java并发编程模式之Active Object模式(四)改进后的java实现
- Swift从0开始学习笔记系列之一(坚持每日一更)
- python学习===实现定时发送,方法一
- ios学习笔记(二)xcode 4.3.2下实现基本交互
- CUDA学习,使用shared memory实现Reverse Array
- Android学习之获取系统应用信息列表的实现