装饰器 -- 函数装饰器(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)

 

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值