装饰器 -- 函数装饰器(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.coroutinedef 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_funcreturn _catch_exceptclass RequestHandlerWrapper(RequestHandler):"""RequestHandler wrapper for write response"""def _write_error(self, status_code, err_msg):"""write_error"""ERR_RESP_TEMPLATE["error"] = err_msgself._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.coroutinedef 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.coroutinedef 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.coroutinedef delete(self, tenant_id):"""delete"""_LOG.info(">> Receive request for delete tenant: %s", tenant_id)RESP_TEMPLATE_4_DELETE['tenant_id'] = tenant_idyield self.__tenant_manager.delete(tenant_id)RESP_TEMPLATE_4_DELETE['state'] = 'SUCCEED'RESP_TEMPLATE_4_DELETE['error'] = Noneself._write(200, RESP_TEMPLATE_4_DELETE)@_catch_except_args()@gen.coroutinedef 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.coroutinedef 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)

posted on 2019-03-16 17:04 wenlin_gk 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wenlin-gk/p/10543134.html

装饰器 -- 函数装饰器(tornado异常响应装饰器)相关推荐

  1. python装饰器函数执行后日志_python使用装饰器作日志处理的方法

    装饰器这东西我看了一会儿才明白,在函数外面套了一层函数,感觉和java里的aop功能很像:写了2个装饰器日志的例子, 第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的 ...

  2. Python 装饰器 函数

    Python装饰器学习(九步入门):http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 浅谈Python装饰器:https://b ...

  3. python装饰器函数-python函数装饰器

    什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...

  4. 装饰器python3菜鸟教程_认识Python装饰器

    Python中的装饰器用来给Python中的函数添加一些辅助功能.比如我们可以把[输出日志]这个辅助功能写到一个装饰器里.只要我们在某个函数A之前添加了这个[输出日志]的装饰器,那么执行函数A的时候, ...

  5. 64 装饰器函数: 母版 csrf防御机制 cookie

    主要内容: 1: 装饰器函数 a: 原理: 在不改变原函数的代码和调用方式的情况下, 给函数动态的添加功能 b: 实例: 装饰器的原理: def yue(tools):print('使用%s约一约' ...

  6. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  7. python之路---装饰器函数

    阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 返回顶部 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班 ...

  8. python装饰器函数-python之路——装饰器函数

    阅读目录 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一个函数,就交给其他开发用了. deffunc1():print('in func1') 季度末,公司的领导要给大 ...

  9. python装饰器函数-python 装饰器 函数被装饰+函数执行

    """ func1.py 文件 1.执行到@w1 2.被装饰函数作为装饰器参数 w1(func=f1()) 3.w1 函数执行有返回值,得用变量接收,变量名为f1 合适 ...

最新文章

  1. 某头条程序员吐槽:前同事银行流水造假,背调也是找同事编的!工资翻了300%!自己老实巴交提供真实银行流水,却惨遭压薪!...
  2. Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100
  3. 找到IIS Express配置/配置数据库文件在哪里?
  4. 七牛云 直播 java_七牛云直播SDK之推流解析
  5. Android发送邮件
  6. 从考研说起:大学、职场、个人选择
  7. Matplolib subplot 子图控制
  8. Meltdown和Foreshadow等补丁被指不完整,处理器易受新攻击
  9. java.lang.IllegalArgumentException: Must specify o
  10. Cannot find class [***] for bean with name '***' defined in file[***]
  11. 小学智能测试软件,小学智能点读宝
  12. 高性能核心板IDO-SOM3908-V1:接口丰富,性能更强,速度更快!
  13. 推荐几部和「隐秘的角落」同样好看的电视剧
  14. hadoop可以解决什么问题_在家艾灸可以解决这些问题
  15. mysql|给表格插入一列,自带固定值
  16. Execute JavaScript
  17. Python爬虫之App爬虫视频下载
  18. 计算机对水利方面的影响,计算机技术对于水利工程信息化系统的优化作用
  19. 关于ESP32卡在上电复位无法下载的问题
  20. (一,1NN-QI)神经网络与深度学习——吴恩达深度学习配套笔记

热门文章

  1. 牛红红的日记(平平无奇拿下域控)
  2. 创建虚拟机以及安装Linux操作系统
  3. java和C结构体通信
  4. access数据类型百度百科_Day 7 基本数据类型
  5. 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍
  6. oracle中正则表达式规则,Oracle中的正则表达式(及函数)详解
  7. java filefilter用法_JFileChooser.JFileFilter用法
  8. tkinter frame背景色_Tkinter教程-基础组件(三)
  9. 计算机教育的需求,我国教育信息化市场需求分析
  10. jieba 分词的三种模式