65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
import logging as logger
|
||
|
||
class ExceptionHandler(object):
|
||
"""异常处理器,可以自行实现错误的捕获、熔断、服务降级等"""
|
||
|
||
def __init__(self, decorator=None):
|
||
if not decorator:
|
||
return
|
||
# 使用自定义装饰器覆盖
|
||
self.decorator = decorator
|
||
|
||
def handle(self, e, *args, **kwargs):
|
||
"""异常处理
|
||
:param e:
|
||
:param args: request args
|
||
:param kwargs: request kwargs
|
||
:return: tuple(content, status, headers)
|
||
:rtype: tuple
|
||
"""
|
||
raise NotImplementedError
|
||
|
||
def decorator(self, func):
|
||
|
||
|
||
def wrapper(*args, **kwargs):
|
||
try:
|
||
return func(*args, **kwargs)
|
||
except Exception as e:
|
||
logger.debug("Exception handle")
|
||
return self.handle(e, *args, **kwargs)
|
||
|
||
return wrapper
|
||
|
||
|
||
class InboundHandler(object):
|
||
"""输入处理管道,可自定义一系列拦截器处理请求信息,如验证、鉴权、数据解码、参数包装等"""
|
||
#__metaclass__ = 'ABCMeta'
|
||
|
||
def handle(self, request, *args, **kwargs):
|
||
"""
|
||
:param dict request: 请求信息 (初始:url, parameters, data, method),可根据需要添加
|
||
:return: (request, args, kwargs)
|
||
"""
|
||
raise NotImplementedError
|
||
|
||
def __call__(self, request, *args, **kwargs):
|
||
return self.handle(request, *args, **kwargs)
|
||
|
||
|
||
class OutboundHandler(object):
|
||
"""输出处理管道,可自定义一系列拦截器处理返回信息,如返回码处理、数据编码等"""
|
||
# __metaclass__ = 'ABCMeta'
|
||
|
||
def handle(self, response, headers, status, content, *args, **kwargs):
|
||
"""
|
||
:param requests.Response response: origin http response
|
||
:param dict headers: the response headers which will be responded
|
||
:param int status: the status code which will be responded
|
||
:param str content: the content which will be responded
|
||
:return: tuple(headers, status, content)
|
||
"""
|
||
raise NotImplementedError
|
||
|
||
def __call__(self, response, headers, status, content, *args, **kwargs):
|
||
return self.handle(response, headers, status, content, *args, **kwargs) |