# 值可变,每次使用需要重新赋值
ERR_RESP_TEMPLATE = {"state": "FAILED", "error": None}
RESP_TEMPLATE_4_DELETE = {"tenant_id": "", "state": "FAILED", "error": None} def _catch_except_args(err_dict=ERR_RESP_TEMPLATE):
def _catch_except(func):
@gen.coroutine
def wrapped_func(self, *args, **kwargs):
"""wrapped function"""
try:
yield func(self, *args, **kwargs)
except TMException as excep:
_LOG.exception(str(excep))
err_dict["state"] = "FAILED" # RESP_TEMPLATE_4_DELETE["state"]可能为"SUCCEED"
err_dict['error'] = str(excep)
self._write(200, err_dict)
except Exception as excep:
_LOG.exception(str(excep))
self._write_error(503, SYSTEM_ERR_MSG) return wrapped_func
return _catch_except class RequestHandlerWrapper(RequestHandler):
"""RequestHandler wrapper for write response""" def _write_error(self, status_code, err_msg):
"""write_error"""
ERR_RESP_TEMPLATE["error"] = err_msg
self._write(status_code, ERR_RESP_TEMPLATE) def _write(self, status_code, msg):
"""write"""
self.set_status(status_code) resp_msg = json.dumps(msg)
self.write(resp_msg) _LOG.debug("<< Return response %d, %s", status_code, resp_msg) class HealthHandler(RequestHandlerWrapper):
"""health check, test interface""" URL = "/api/v1/health" def initialize(self, service):
"""initialize"""
pass @gen.coroutine
def get(self):
"""response ok"""
self._write(200, {"state": "Tenant manager is ready."}) class TenantHandler(RequestHandlerWrapper):
"""TenantHandler""" URL = [r"/api/v1/tenants/([\w|\-|\.]*)", r"/api/v1/tenants"] def initialize(self, service):
"""initialize"""
self.__tenant_manager = service @_catch_except_args()
@gen.coroutine
def post(self):
"""post"""
_LOG.info(">> Receive request for add tenant: %s", self.request.body) tenant_info_dict = json_2_dict(self.request.body)
tenant_info_dict = yield self.__tenant_manager.add(tenant_info_dict)
self._write(200, tenant_info_dict) @_catch_except_args(err_dict=RESP_TEMPLATE_4_DELETE)
@gen.coroutine
def delete(self, tenant_id):
"""delete"""
_LOG.info(">> Receive request for delete tenant: %s", tenant_id) RESP_TEMPLATE_4_DELETE['tenant_id'] = tenant_id yield self.__tenant_manager.delete(tenant_id) RESP_TEMPLATE_4_DELETE['state'] = 'SUCCEED'
RESP_TEMPLATE_4_DELETE['error'] = None
self._write(200, RESP_TEMPLATE_4_DELETE) @_catch_except_args()
@gen.coroutine
def put(self, tenant_id):
"""put"""
_LOG.info(">> Receive request for update tenant: %s, %s",
tenant_id, self.request.body) tenant_info_dict = json_2_dict(self.request.body)
tenant_info_dict = self.__tenant_manager.update(
tenant_id, tenant_info_dict)
self._write(200, tenant_info_dict) @_catch_except_args()
@gen.coroutine
def get(self, tenant_id=None):
"""get"""
_LOG.debug(">> Receive request for get tenant(s): %s, %s",
tenant_id, self.request.headers) # 当tenant_id字符串中包含非法字符时:tenant_id被u""代替
substr_of_tenant_id = self.get_argument("tenant_id", None)
query_condition = QueryCondition(
tenant_id, substr_of_tenant_id, self.request.headers)
resp_body = self.__tenant_manager.query(query_condition)
self._write(200, resp_body)

装饰器 -- 函数装饰器(tornado异常响应装饰器)的更多相关文章

  1. day11 装饰器---函数的使用方法

    这个是一个难点,以后面试会经常出现的,要搞懂! 装饰器升级版,进阶内容1: def outer(flag): def wrapper(func): def inner(*args,**kwargs): ...

  2. Python学习日记(九) 装饰器函数

    1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...

  3. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

  4. property内置装饰器函数和@name.setter、@name.deleter

    # property # 内置装饰器函数 只在面向对象中使用 # 装饰后效果:将类的方法伪装成属性 # 被property装饰后的方法,不能带除了self外的任何参数 from math import ...

  5. python基础篇_004_装饰器函数

    python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...

  6. Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

    函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...

  7. Python之函数的本质、闭包、装饰器

    函数名的本质 函数名本质上就是函数的内存地址. 1.可以赋值给其他变量,被引用 def func(): print('in func') f = func print(f) 2.可以被当作容器类型的元 ...

  8. python基础(8)-装饰器函数&进阶

    从小例子进入装饰器 统计一个函数执行耗时 原始版本 import time # time模块有提供时间相关函数 def do_something(): print("do_something ...

  9. python之装饰器函数

    本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...

随机推荐

  1. CSS学习笔记-05 过渡模块的基本用法

    话说 1对情侣两情相悦,你情我愿.时机成熟,夜深人静...咳 ,如果就这么直奔主题,是不是有点猴急,所以,还是要来点前戏@. 铛 铛, 这个时候 过渡模块出现了. 划重点: 上代码: <!DOC ...

  2. jmeter接口测试基础知识1.0

    jmeter:性能测试工具,压测测试计划右键--添加--Threads(Users)--线程组(线程数就是并发数)--右键线程组--添加--Sampler--HTTP请求--最上面的名称可以修改,就是 ...

  3. js获取table中的列的数字的和

    function getTdValue(a) { var tableId = document.getElementById("tab"); var num; for(var i= ...

  4. 近期面试总结(Android)

    关于近期面试总结(2018年下半年) 有些是老生常谈有些是没有遇到的. 1.HTTP和HTTPS的区别 HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为 ...

  5. nf_conntrack

    How to Fix Nf_conntrack Table Full Dropping Packet Linux CentOS PacketLoss  2 minutes to read (234 w ...

  6. 3.1 unittest简介

    3.1 unittest简介 前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG.python里面也有单元测试框架-unittest,相当于是一个python版的junit.py ...

  7. 安装单机CHD5.12报错解决(补充)

    一.oozie启动失败 (1) 拷贝mysql的驱动文件. 一个是需要把java的mysql的驱动jar文件拷贝到oozie的lib目录中 /opt/cloudera/parcels/CDH-5.12 ...

  8. python中datetime常用方法

    # 可运算的时间方法包 >>> import datetime >>> import time >>> res = datetime.dateti ...

  9. js基本类型,隐式转换,变量

    Js笔记(脚本语言 node.js) Js五种基本类型:数字,字符串,布尔,null,undefined: HTML结构,表现,行为分离. 变量命名规则: 以字母或[下划线开始($)]不推荐,后面跟上 ...

  10. 在html中做表格以及给表格设置高宽字体居中和表格线的粗细

    今天学习了如何用HTML在网页上做表格,对于我这种横列部分的属实有点麻烦,不过在看着表格合并单过格的时候我把整个表格看做代码就容易多了. 对于今天的作业让我学习了更多的代码,对于代码的应用希望更加熟练 ...