使用 twisted 的 txrestapi 模块提供基本的异步 API 服务。
2016-06-19 17:41
323 查看
twisted 是python的一个异步网络框架,txrestapi 是基于 twisted 的一个 RESTFUL API 服务的包,使用 txrestapi 的代码基本如下:
当我们把程序运行起来后,可以在浏览器中访问 http://127.0.0.1:8080/path1 得到 path1, 访问其他可以得到 default route.
从代码来看,这个路由请求的回调函数是比较快的执行结束了。但是存在一个问题,如果某一个路由请求需要执行一段时间后才能得到最终的结果,如何才能将正确的数据返回给请求者呢? 这里就需要用到 twisted.web.server.NOT_DONE_YET 这个属性。这样把 NOT_DONE_YET 返回给 reactor 的时候,它不会立即构造 response 返回给请求者,一直会得到 request.finish() 的调用,或者超时!
因此,我们修改代码如下:
执行代码,在浏览器访问 http://127.0.0.1:8080/path1, 每次都会延迟 5s, 在这 5s 内,继续请求其他路径,不会被阻塞,立刻得到响应!
如此,当路径请求 path1 处于等待状态的时候,reactor 会继续接收其他的路径请求!
from twisted.internet import reactor from twisted.web import server from txrestapi.resource import APIResource from txrestapi.methods import GET, POST, PUT, ALL class MyResource(APIResource): @GET("/path1") def path1(self, request): return "path1" @POST("/path2") def path2(self, request): return "path2" @ALL("/") def default(self, request): return "default route" if __name__ == "__main__": site = server.Site(MyResource()) reactor.listenTCP(8080, site) reactor.run()
当我们把程序运行起来后,可以在浏览器中访问 http://127.0.0.1:8080/path1 得到 path1, 访问其他可以得到 default route.
从代码来看,这个路由请求的回调函数是比较快的执行结束了。但是存在一个问题,如果某一个路由请求需要执行一段时间后才能得到最终的结果,如何才能将正确的数据返回给请求者呢? 这里就需要用到 twisted.web.server.NOT_DONE_YET 这个属性。这样把 NOT_DONE_YET 返回给 reactor 的时候,它不会立即构造 response 返回给请求者,一直会得到 request.finish() 的调用,或者超时!
因此,我们修改代码如下:
class MyResource(APIResource): def __init__(self): APIResource.__init__(self) pass @GET("/path1") def path1(self, request): def make_response(req): req.write("end path1 request") req.finish() d = Deferred() d.addCallback(make_response) reactor.callLater(5, d.callback, request) return server.NOT_DONE_YET @POST("/path2") def path2(self, request): return "path2" @ALL("/") def default(self, request): return "default route"
执行代码,在浏览器访问 http://127.0.0.1:8080/path1, 每次都会延迟 5s, 在这 5s 内,继续请求其他路径,不会被阻塞,立刻得到响应!
如此,当路径请求 path1 处于等待状态的时候,reactor 会继续接收其他的路径请求!
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法