简单的 Nova REST API 实现程序
来源:互联网 发布:大数据一体机 编辑:程序博客网 时间:2024/06/05 16:49
正在看Nova API的代码, 仿照其中的REST 实现写了一个程序.
Nova API 当然支持了更多的功能, 例如XML/JSON序列化, 身份验证等等. 这个测试程序只实现其中的REST功能
MyRouter: 负责把HTTP请求, 根据匹配规则, 分发到不同的Application中
1) [ Python Deploy ] 收到HTTP请求后, 先调用 MyRouter的 __call__方法进行处理
2) [ MyRouter ] 根据内部的匹配定义, 通过RouteMiddleware 分发到对应的 MyApplication
MyApplication: 收到HTTP 请求后, 解析其中的参数信息, 调用后台的MyController业务类的对应方法
MyController: 最终的业务类, 接受参数, 执行业务逻辑的操作.
from __future__ import print_functionfrom routes import Mapperimport webob.decimport webob.excimport routes.middlewareimport testtoolsclass MyController(object): def getlist(self, mykey): print("step 4: MyController's getlist(self, mykey) is invoked") return "getlist(), mykey=" + mykeyclass MyApplication(object): """Test application to call from router.""" def __init__(self, controller): self._controller = controller def __call__(self, environ, start_response): print("step 3: MyApplication is invoked") action_args = environ['wsgiorg.routing_args'][1].copy() try: del action_args['controller'] except KeyError: pass try: del action_args['format'] except KeyError: pass action = action_args.pop('action', None) controller_method = getattr(self._controller, action) result = controller_method(**action_args) start_response('200 OK', [('Content-Type', 'text/plain')]) return [result]class MyRouter(object): """Test router.""" def __init__(self): route_name = "dummy_route" route_path = "/dummies" my_application = MyApplication(MyController()) self.mapper = Mapper() self.mapper.connect(route_name, route_path, controller=my_application, action="getlist", mykey="myvalue", conditions={"method": ['GET']}) self._router = routes.middleware.RoutesMiddleware(self._dispatch, self.mapper) @webob.dec.wsgify(RequestClass=webob.Request) def __call__(self, req): """Route the incoming request to a controller based on self.map. If no match, return a 404. """ print("step 1: MyRouter is invoked") return self._router @staticmethod @webob.dec.wsgify(RequestClass=webob.Request) def _dispatch(req): """Dispatch the request to the appropriate controller. Called by self._router after matching the incoming request to a route and putting the information into req.environ. Either returns 404 or the routed WSGI app's response. """ print("step 2: RoutesMiddleware is invoked, calling our _dispatch back") match_dict = req.environ['wsgiorg.routing_args'][1] if not match_dict: return webob.exc.HTTPNotFound() app = match_dict['controller'] return app class RoutingTestCase(testtools.TestCase): def test_router(self): router = MyRouter() result = webob.Request.blank('/dummies').get_response(router) self.assertEqual(result.body, "getlist(), mykey=myvalue")
从输出结果, 可以看出调用顺序是: MyRouter --> routes.middleware.RoutesMiddleware --> MyApplication --> MyController:
[Test Case] test_routerstep 1: MyRouter is invokedstep 2: RoutesMiddleware is invoked, calling our _dispatch backstep 3: MyApplication is invokedstep 4: MyController's getlist(self, mykey) is invoked
0 0
- 简单的 Nova REST API 实现程序
- nova list的nova-api.log
- 六步实现Rest风格的API
- REST以及RESTful的实现:Web API
- 六步实现Rest风格的API
- 六步实现Rest风格的API
- 六步实现Rest风格的API
- 六步实现Rest风格的API
- 六步实现Rest风格的API
- 一个简单的语音识别实现---百度在线语音识别REST API SDK(Python)简单使用
- Nova API服务之Nova API服务的启动
- 简单的REST的框架实现
- 简单的REST的框架实现
- 简单的REST的框架实现
- 简单的REST的框架实现
- 简单的REST的框架实现
- Windows API实现最最简单的窗口程序
- ALM11的REST API
- poj 1833排列
- C++中函数指针的使用
- 再谈留学申请选校地理位置的优势
- PonyDebugger 手动安装
- Asp.Net alert弹出提示信息的5种方法
- 简单的 Nova REST API 实现程序
- hdu1339
- Android在onCreate()中获得控件尺寸
- SharePoint2010 Feature功能开发——为SharePoint的ECB菜单(列表项或文档的操作菜单项)添加自定义菜单栏项目
- Android中ListView与CheckBox结合----多选与记录
- 第六届深圳国际物联网和智慧中国博览会(2014)总结
- 赤脚跑步只是一个骗局
- mdev自动挂载sd卡
- hdu 4035 概率DP 成都网赛