1.在PasteDeploy部署caesar-api服务时,setup_app中建立app,app中设置hooks,hooks负责加载conf配置文件和数据库连接 self.storage_connection。

从而在请求访问时可以调用对应钩子对象的方法。

def setup_app(pecan_config=None, extra_hooks=None):
# FIXME: Replace DBHook with a hooks.TransactionHook
app_hooks = [hooks.ConfigHook(CONF),
hooks.DBHook(CONF)]
# 配置文件钩子ConfigHook和数据库连接DBHook钩子。
if extra_hooks:
app_hooks.extend(extra_hooks) if not pecan_config:
pecan_config = get_pecan_config() pecan.configuration.set_config(dict(pecan_config), overwrite=True) # NOTE(sileht): pecan debug won't work in multi-process environment
pecan_debug = CONF.api.pecan_debug
if CONF.api.workers and CONF.api.workers != 1 and pecan_debug:
pecan_debug = False app = pecan.make_app(
pecan_config.app.root,
debug=pecan_debug,
force_canonical=getattr(pecan_config.app, 'force_canonical', True),
hooks=app_hooks, #添加请求钩子
wrap_app=middleware.ParsableErrorMiddleware,
guess_content_type_from_ext=False
) return app  

在DBHook中,before方法RoutingState中添加数据库连接属性storage_conn:从而在pecan.requst.storage_conn获取数据库连接

class DBHook(hooks.PecanHook):

    def __init__(self, conf):
self.storage_connection = self.get_connection(conf) if not self.storage_connection:
raise Exception(
"API failed to start. Failed to connect to database") def before(self, state):
# 添加数据库连接
state.request.storage_conn = self.storage_connection @staticmethod
def get_connection(conf):
try:
return storage.get_connection_from_config(conf)
except Exception as err:
LOG.exception("Failed to connect to db" "retry later: %s",
err)

通过debug:

在请求时无法使用pdb进行debug断点测试,需要在代码中设置import pdb;pdb.set_trace()同时,使用gdb attach 服务进程,然后再发送请求时,才会自动到断点位置。

2.请求访问(pecan对象路由框架)

在根目录root.py中定义v2对象,路由到V2Controller

class RootController(object):
def __init__(self):
self.v2 = v2.V2Controller()

在V2Controller中定义_look_up方法,对/v2/后的字段判断,如果为meters则路由到 meters.MetersController()对象

class V2Controller(rest.RestController):

    @pecan.expose()
def _lookup(self, kind, *remainder):
if kind == 'meters':
return meters.MetersController(), remainder

meters.MetersController()又路由到 MeterController(meter_name),其中的meter_name作为meters后的另一个参数。如果懂得springmvc的controller的requestMapping中路径映射,其类似于

@RequestMapping(value = "/xxx/{xxx}",method=RequestMethod.GET)中{xxx}动态获取请求中的变量

class MetersController(rest.RestController):
"""Works on meters.""" @pecan.expose()
def _lookup(self, meter_name, *remainder):
return MeterController(meter_name), remainder

在 MeterController(meter_name)中 GET请求被路由到get_all方法中,@wsme_pecan.wsexpose([OldSample], [base.Query], int)对请求参数和相应返回进行转化,返回值为list的OldSample对象,第一个参数为list的base.Query对象可以为None,limit 是int类型,可为None

class MeterController(rest.RestController):
"""Manages operations on a single meter."""
_custom_actions = {
'statistics': ['GET'],
} def __init__(self, meter_name):
pecan.request.context['meter_name'] = meter_name
self.meter_name = meter_name @wsme_pecan.wsexpose([OldSample], [base.Query], int)
def get_all(self, q=None, limit=None):
"""Return samples for the meter. :param q: Filter rules for the data to be returned.
:param limit: Maximum number of samples to return.
""" q = q or []
limit = v2_utils.enforce_limit(limit)
kwargs = v2_utils.query_to_kwargs(q, storage.SampleFilter.__init__)
kwargs['meter'] = self.meter_name
f = storage.SampleFilter(**kwargs)
return [OldSample.from_db_model(e)
for e in pecan.request.storage_conn.get_samples(f, limit=limit) # 数据库连接对象,调用其get_samples获取数据库数据
]

最后调用接口,查询数据库数据:

1.启动caesar-api服务:

2.调用/v2/meters接口获取数据

以上只是个人感悟,具体可参考我的github: https://github.com/CaesarLinsa/ceilometer_TestCase

pecan API调用的更多相关文章

  1. Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

    概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用.这个应用始终遗留了一个问题,Web App在访问REST AP ...

  2. 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)

    信鸽推送 .NET  服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...

  3. xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)

    xmlrpc实现bugzilla4   xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...

  4. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  5. Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  6. (36)老版和新版API调用

    ---------更新时间18:06 2016-09-18 星期日------- *前言   我用的是odoo8,但里面有相当多的api是以前版本,这时若我们自己开发的   插件采用新版本api,里面 ...

  7. Sphinx中文分词详细安装配置及API调用实战

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  8. 控制ASP.NET Web API 调用频率与限流

    ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...

  9. jquery api调用

    本框架内置组件以及部分插件都可以通过jquery选择器进行API调用,支持链式操作,如下示例. <script type="text/javascript"> $(&q ...

随机推荐

  1. django之前-----web应用与框架

    一web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S. 下面来看一个简 ...

  2. 《算法》第五章部分程序 part 8

    ▶ 书中第五章部分程序,包括在加上自己补充的代码,适用于基因序列的 2-Bit 压缩算法,行程长压缩算法,Huffman 压缩算法,LZW 压缩算法 ● 适用于基因序列的 2-Bit 压缩算法 pac ...

  3. Redis、MongoDB及Memcached的区别

    Redis(内存数据库) 是一个key-value存储系统(布式内缓存,高性能的key-value数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).l ...

  4. spring+mybatis 配置双数据源

    配置好后,发现网上已经做好的了, 不过,跟我的稍有不同, 我这里再拿出来现个丑: properties 文件自不必说,关键是这里的xml: <?xml version="1.0&quo ...

  5. ClassNotFoundException: javax.validation.ValidatorFactory

    spring mvc 程序. 浏览器一访问controller 则出现: ClassNotFoundException: javax.validation.ValidatorFactory ... 很 ...

  6. liunx poi excel下载内容乱码本地tomcat正常

    结论:在jsp中加上out.clear即可(前提保证生成的excel在服务器上是正确的,只是浏览器传输才出现乱码). dowload.jsp完整代码 <%@ page language=&quo ...

  7. MVC基于角色权限控制--菜单展示

    在用户成功登陆后台页面后,我们需要将当前用户拥有的权限通过菜单的形式展现出来,将未具备的权限隐藏 新建一个HomeController,用于展示后台首页和获取用户权限数据 namespace CZBK ...

  8. SonarQube与Eclipse配合

    Sonar安装 下载Sonar 点击下面网址下载Sonar: http://dist.sonar.codehaus.org/sonar-3.5.1.zip ,下载后解压 解压后安装 解压后你将要看到如 ...

  9. wget 递归下载整个网站(网站扒皮必备)

    有时间看到别人网站的页面比较漂亮,就想给扒皮下来,学习学习.分享一个我常用网站扒皮命令wget 这个命令可以以递归的方式下载整站,并可以将下载的页面中的链接转换为本地链接. wget加上参数之后,即可 ...

  10. jquery-menu-aim插件实现二级导航

    jquery-menu-aim插件是实现二级导航亚马逊式三角滑动的强力工具,它在性能上极佳,快速滑动,基本无延迟效果,源码位置见对应作者的github,接下来附上样例代码: $(function () ...