# 值可变,每次使用需要重新赋值
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. E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决

    在用apt-get安装软件时出现了类似于install-info: No dir file specified; try --help for more information.dpkg:处理 get ...

  2. QFileSystemModel中通过flags函数反应代码的层级思考

    Qt的Model/View设计中,有一些隐藏的代码,它们大多放在私有类里,对于类的作用非常关键,体现着Qt的整体设计思想.然而,由于它们比较隐蔽,学习起来比较繁琐,受到人们的忽视.然而,体现设计思想, ...

  3. Linux:ldd命令详解

    ldd 用于打印程序或者库文件所依赖的共享库列表. 语法 ldd(选项)(参数) 选项 --version:打印指令版本号: -v:详细信息模式,打印所有相关信息: -u:打印未使用的直接依赖: -d ...

  4. C# ModBus Tcp读写数据 与服务器进行通讯

    前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus TCP的客户端,方便的对Modbus tcp的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...

  5. 移动web总结

    Meta标签:   1 <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc ...

  6. 如何用Python写一个每分每时每天的定时程序

    1.计算生日是星期几 当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~ 比如girl friend ...

  7. spring boot 之 spring task(定时任务)

    cron:通过表达式来配置任务执行时间cron表达式详解 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为: 秒(0~59)分钟(0~59)3 小时(0~23)4  天(0 ...

  8. vue2中使用mint-ui,性别选择

    安装需要的组件 import { DatetimePicker,Toast,Popup,Picker } from 'mint-ui'; templete部分 <div class=" ...

  9. hsdfz -- 6.18 -- day3

    第三次被hn菜和hn话支配…… 相比起前两天好一点,但是由于前面时间安排的太散(睡着了……)导致c题DP差一点肝出来(所以最后没有…… 恩就算肝出来DP也只有30分,这次好歹是有DP思路了,继续康复吧 ...

  10. 在windows上使用ssh秘钥连接git服务器

    git部署在centos7上 安装好git后,新建一个用户test(注意要加入git用户组)配置ssh秘钥登录,我的另一篇博客有写配置步骤 重点的地方是在windows系统上使用秘钥登录git服务器 ...