装饰器 -- 函数装饰器(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开发,我们从今天开始要去公司上班了.写了一 ...
随机推荐
- centos重置密码
重置root密码: 法一: 1.开机按e 2.将linux 16后的ro改为rw init=/sysroot/bin/ ...
- 福大软工 · BETA 版冲刺前准备(团队)
BETA 版冲刺前准备 队名:第三视角 作业链接 组长博客 应作业要求为了更加顺利地开展beta版本的冲刺,上次的alpha版本展示后,我们组对之前开发过程中存在的各种问题进行了全面的讨论,并对其进行 ...
- vue 创建项目
先安装node.js环境 #先安装npm 阿里镜像 (之后cnpm 下载组件快速) npm install -g cnpm --registry=https://registry.npm.taobao ...
- SharePoint Framework 基于团队的开发(一)
博客地址:http://blog.csdn.net/FoxDave SharePoint Framework是新的用来构建SharePoint自定制的开发模型,它专注于客户端开发并用热门的开源工具gu ...
- ionic3 自定义组件 滑动选择器 ion-multi-picker
1.ionic3中有一个 ion-datatime 给大家选择时间提供了一个很方便的组件 效果如图 链接 https://ionicframework.com/docs/api/component ...
- Hadoop学习笔记03_Hive练习
Apache Hive是提供了一种数据映射去读取文本数据,以及提供了类SQL的语句来执行MapReduce. 也就是一种更简化操作的MR. 之前的练习是跟着视频学的hive-1.2.2 而这几天自己练 ...
- 关于vuex和Promise reject 或.catch 的报错处理。
在我们开发过程中,经常会使用vuex来管理接口请求和返回数据. 在vue组件页面使用computed来读取vuex中state的数据. getTaskList({ commit }, payload) ...
- CDMA码片序列问题
要想知道到底是怎么算的 建议看见这篇博客的任何一位去先看一下这篇博客:https://blog.csdn.net/dog250/article/details/6420427 在CDMA中.每一个比特 ...
- How Region Split works in Hbase
A region is decided to be split when store file size goes above hbase.hregion.max.filesize or accord ...
- scrapy框架的日志等级和请求传参
日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...