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基础之python WSGI,paste,Routes,webob

wsgi是在PEP333中定义的: PEP:   333 Title: Python Web Server Gateway Interface v1.0 Author: Phillip ...
  • happyAnger6
  • happyAnger6
  • 2017年01月15日 23:11
  • 2329

Openstack API 类型 & REST 风格

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

Tempest Smoke-Test

1 tempest.api.compute.admin.test_agents.AgentsAdminTestJSON.test_create_agent 2 tempest.api....
  • z770816239
  • z770816239
  • 2016年04月15日 10:07
  • 716

openstack-wsgi的route中增加api流程详解(os-networks)增加

在前面文章中,已经详细介绍了,如何从页面dashboard调用novaclient然后生成一个url地址 ,或从启动nova --debug list 然后调用novaclient然后生成URL地...
  • tantexian
  • tantexian
  • 2014年07月16日 19:41
  • 23514

通过Rest API调用OpenStack

OpenStack本身提供两种调用的方式 一、Command Line:如nova create,nova start 等各种命令 二、Restful Webservice:供OpenStack各...
  • cnyyx
  • cnyyx
  • 2015年02月15日 17:13
  • 5583

openstack restful api 使用

Openstack每个项目的接口遵循REST原则,通常也被称为RESTful接口,如何使用restful api 第一件事情你必须使用你的证书来认证来获取authentication token...
  • chinagissoft
  • chinagissoft
  • 2015年12月25日 10:14
  • 1921

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

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

扩展 OpenStack 的 REST API 的方法

以Nova REST API为例, 你应该按照以下步骤来扩展 Nova REST API (使用 类nova.api.openstack.compute.contrib.floating_ips.F...
  • zhaoeryi
  • zhaoeryi
  • 2014年08月19日 17:22
  • 4001

restclient 测试 调用openstack api

火狐firefox 的 restclient 工具来 使用 openstack的api 下面我还尝试了一些Firefox的restclient,来调取api 当然需要打开火狐浏览器安装restcl...
  • xiaoreqing
  • xiaoreqing
  • 2016年09月12日 10:04
  • 1242

OpenStack之RESTful API调用(一)

前面两篇文章分析了OpenStack同一组件下不同模块之间的通信方式——RPC。这篇文章我们来继续看一下OpenStack中的另一种通信方式——RESTful API。 在OpenStack中,RES...
  • qiuhan0314
  • qiuhan0314
  • 2015年01月16日 09:03
  • 2040
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openstack 中的Routes + webob 的 REST API
举报原因:
原因补充:

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