装饰器 -- 函数装饰器(tornado异常响应装饰器)
# 值可变,每次使用需要重新赋值
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异常响应装饰器)的更多相关文章
- day11 装饰器---函数的使用方法
这个是一个难点,以后面试会经常出现的,要搞懂! 装饰器升级版,进阶内容1: def outer(flag): def wrapper(func): def inner(*args,**kwargs): ...
- Python学习日记(九) 装饰器函数
1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...
- property内置装饰器函数和@name.setter、@name.deleter
# property # 内置装饰器函数 只在面向对象中使用 # 装饰后效果:将类的方法伪装成属性 # 被property装饰后的方法,不能带除了self外的任何参数 from math import ...
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
- Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数
函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...
- Python之函数的本质、闭包、装饰器
函数名的本质 函数名本质上就是函数的内存地址. 1.可以赋值给其他变量,被引用 def func(): print('in func') f = func print(f) 2.可以被当作容器类型的元 ...
- python基础(8)-装饰器函数&进阶
从小例子进入装饰器 统计一个函数执行耗时 原始版本 import time # time模块有提供时间相关函数 def do_something(): print("do_something ...
- python之装饰器函数
本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...
随机推荐
- A JSON example
heroes.html<!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- 5.使用std的迭代器访问并修改图像
void Test_ColorReduceByIterator() { Mat g_srcImage=imread("D:\\OpenCV Projects\\OpenCV_Test_Ima ...
- 2017年4月7日16:18:17 java8 常用记录
List<String> customerUids = customerTagModel.stream().map(CustomerTagModel::getCustomerUid) ...
- Python全栈之路----函数----嵌套函数
函数内部可以再次定义函数 要执行函数,必须调用 def func1(): print('alex') def func2(): print('eric') func2() #如果没有这一句,不会pri ...
- 使用golang 编写postgresql 扩展
postgresql 的扩展可以帮助我们做好多强大的事情,支持的开发语言有lua.perl.java.js.c 社区有人开发了一个可以基于golang开发pg 扩展的项目,使用起来很方便,同时为我 ...
- linux下一些重要命令的了解
linux下一些比较重要的命令: du命令: 查看使用空间: 格式: du [选项][文件] 参数: -a 显示目录中个别文件的大小. -b 显示目录或文件大小时,以byte为单位. -c 除了 ...
- Java面向对象 第3节 类的封装和继承
一.封装 封装的概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作. 封装的2个大致原则:1)把尽可能多的东西隐藏起来,对外提供便捷的接口 ...
- Java面向对象 第2节 Scanner 类和格式化输出printf
§Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...
- iOS兼容性(不断完善)
1.iOs不支持iframe,不支持flash,如果移动端要嵌入视频,请用html5 的video标签.
- Java面试题 Web+EJB & Spring+数据结构& 算法&计算机基础
六.Web 部分:(共题:基础40 道,基础37 道,中等难度3 道) 122.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? [基础] 答:Web 容器加载Servlet ...