openstack 中的Routes + webob 的 REST API

转载 2014年11月12日 00:29:28

首先贴一段代码

from __future__ import print_function
from routes import Mapper
import webob.dec
import webob.exc
import routes.middleware
import testtools

class MyController(object):
    def getlist(self, mykey):
        print("step 4: MyController's getlist(self, mykey) is invoked")
        return "getlist(), mykey=" + mykey

class 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")


然后见博客中有较为详细的理解,但是要深入的话还是需要深入阅读文档

相关文章推荐

Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb

目录目录 Paste PasteDeploy Routes WebOb 简介 WSGI入口 Paste和PasteDeploy 配置文件 pasteini 中间件的实现 Routes WebOb...
  • Jmilk
  • Jmilk
  • 2016年07月27日 16:37
  • 4197

openstack基础之python WSGI,paste,Routes,webob

wsgi是在PEP333中定义的: PEP:   333 Title: Python Web Server Gateway Interface v1.0 Author: Phillip ...

Openstack源代码分析之PasteDeploy+Webob实例以及Openstack源代码下PasteDeploy+Webob+Routes分析

通过PasteDeploy+Webob来配置WSGI服务器接口 Webob是一种封装了HTTP协议的模块,具体课参考官方文档,不过这两天不知为什么不能访问,我是直接下载的源代码,源代码下docs自带本...

wsgi+webob+routes学习笔记-初学篇(中)

接上文: 可以看到wsgi已经在8090端口上建立了,用Rest client发个消息看下,可以看到已经收到了响应“Hello, World! I am sxmatch” 在以上程序中:方法d...
  • sxmatch
  • sxmatch
  • 2013年08月08日 10:47
  • 767

Openstack REST API 调用开发入门

Openstack REST API 调用开发入门 转载注明出处: 访问Openstack的各个服务有REST API、DashBoard、Conmand Line等几种方式,几种访问方式大同小...

扩展 OpenStack 的 REST API 的方法

以Nova REST API为例, 你应该按照以下步骤来扩展 Nova REST API (使用 类nova.api.openstack.compute.contrib.floating_ips.F...

Openstack API 类型 & REST 风格

目录目录 Openstack 提供了三种操作方式 Web界面 CIL 指令行 RESTful API REST 风格 基于HTTP协议的RESTful API OpenStack中的RESTful A...
  • Jmilk
  • Jmilk
  • 2016年07月26日 00:06
  • 2243

使用cURL操作Openstack对象存储的ReST API

cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。本文主要是介绍使用该工具和HTTP协议与swift服务如何交互。cURL允许你从命令行或sh...

openstack学习笔记 --- Rest API

1 什么是REST ? 表述性状态转移(Representational State Transfer)是一种软件架构风格。是设计风格而不是标准。REST 从资源的角度来观察整个网络,分布在各处...
  • rually
  • rually
  • 2015年04月24日 17:02
  • 737

Ember.js API (v2.11.0) 翻译 ---004.Routing---002---Defining Your Routes Edit Page(定义你的路由)

Defining Your Routes Edit Page 定义你自己的路由 When your application starts, the router matches the c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openstack 中的Routes + webob 的 REST API
举报原因:
原因补充:

(最多只允许输入30个字)