1.在PasteDeploy部署caesar-api服务时,setup_app中建立app,app中设置hooks,hooks负责加载conf配置文件和数据库连接 self.storage_connection。
从而在请求访问时可以调用对应钩子对象的方法。
def setup_apppecan_config=None, extra_hooks=None): # FIXME: Replace DBHook with a hooks.TransactionHook app_hooks = [hooks.ConfigHookCONF), hooks.DBHookCONF)]
# 配置文件钩子ConfigHook和数据库连接DBHook钩子。 if extra_hooks: app_hooks.extendextra_hooks) if not pecan_config: pecan_config = get_pecan_config) pecan.configuration.set_configdictpecan_config), overwrite=True) # NOTEsileht): 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=getattrpecan_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 DBHookhooks.PecanHook):
def __init__self, conf):
self.storage_connection = self.get_connectionconf)
if not self.storage_connection:
raise Exception
"API failed to start. Failed to connect to database")
def beforeself, state):
# 添加数据库连接
state.request.storage_conn = self.storage_connection
@staticmethod
def get_connectionconf):
try:
return storage.get_connection_from_configconf)
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 RootControllerobject): def __init__self): self.v2 = v2.V2Controller)
在V2Controller中定义_look_up方法,对/v2/后的字段判断,如果为meters则路由到 meters.MetersController)对象
class V2Controllerrest.RestController): @pecan.expose) def _lookupself, kind, *remainder): if kind == 'meters': return meters.MetersController), remainder
meters.MetersController)又路由到 MeterControllermeter_name),其中的meter_name作为meters后的另一个参数。如果懂得springmvc的controller的requestMapping中路径映射,其类似于
@RequestMappingvalue = “/xxx/{xxx}“,method=RequestMethod.GET)中{xxx}动态获取请求中的变量
class MetersControllerrest.RestController): """Works on meters.""" @pecan.expose) def _lookupself, meter_name, *remainder): return MeterControllermeter_name), remainder
在 MeterControllermeter_name)中 GET请求被路由到get_all方法中,@wsme_pecan.wsexpose[OldSample], [base.Query], int)对请求参数和相应返回进行转化,返回值为list的OldSample对象,第一个参数为list的base.Query对象可以为None,limit 是int类型,可为None
class MeterControllerrest.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_allself, 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_limitlimit)
kwargs = v2_utils.query_to_kwargsq, storage.SampleFilter.__init__)
kwargs['meter'] = self.meter_name
f = storage.SampleFilter**kwargs)
return [OldSample.from_db_modele)
for e in pecan.request.storage_conn.get_samplesf, limit=limit) # 数据库连接对象,调用其get_samples获取数据库数据
]
最后调用接口,查询数据库数据:
1.启动caesar-api服务:
2.调用/v2/meters接口获取数据
以上只是个人感悟,具体可参考我的github: https://github.com/CaesarLinsa/ceilometer_TestCase