Spaces:
Sleeping
Sleeping
import json | |
from enum import IntEnum, unique | |
from functools import wraps | |
from typing import Mapping, Any, Type, Optional, Tuple, Union, Iterable, Callable | |
import flask | |
import requests | |
from flask import jsonify | |
class CommonErrorCode(IntEnum): | |
SUCCESS = 0 | |
COMMON_FAILURE = 1 | |
def flask_response( | |
success: bool, | |
data: Optional[Mapping[str, Any]] = None, | |
message: Optional[str] = None, | |
code: Optional[int] = None, | |
): | |
return jsonify( | |
{ | |
'success': success, | |
'code': 0 if success else (code or CommonErrorCode.COMMON_FAILURE), | |
'message': (message or 'Success.') if success else (message or 'Failed.'), | |
'data': data, | |
} | |
) | |
def success_response(data: Optional[Mapping[str, Any]] = None, message: Optional[str] = None): | |
return flask_response( | |
success=True, | |
code=CommonErrorCode.SUCCESS, | |
message=message, | |
data=data, | |
) | |
def failure_response( | |
code: Optional[int] = None, message: Optional[str] = None, data: Optional[Mapping[str, Any]] = None | |
): | |
return flask_response( | |
success=False, | |
code=code or CommonErrorCode.COMMON_FAILURE, | |
message=message, | |
data=data, | |
) | |
_RESPONSE_VALUE_TYPE = Tuple[int, bool, int, str, Mapping[str, Any]] | |
def get_values_from_response(response: Union[requests.Response, flask.Response]) -> _RESPONSE_VALUE_TYPE: | |
status_code = response.status_code | |
_content = response.content if hasattr(response, 'content') else response.data | |
_json = json.loads(_content.decode()) | |
success, code, message, data = _json['success'], _json['code'], _json.get('message', ''), _json.get('data', {}) | |
return status_code, success, code, message, data | |
class ResponsibleException(Exception): | |
def __init__( | |
self, | |
code: int = CommonErrorCode.COMMON_FAILURE, | |
message: Optional[str] = None, | |
data: Optional[Mapping[str, Any]] = None, | |
status_code: int = 400 | |
): | |
Exception.__init__(self, message) | |
self.__code = code | |
self.__message = message | |
self.__data = data or {} | |
self.__status_code = status_code | |
def get_response(self): | |
return failure_response(self.__code, self.__message, self.__data), self.__status_code | |
def responsible(classes: Iterable[Type[ResponsibleException]] = None): | |
if classes is None: | |
classes = (ResponsibleException, ) | |
def _decorator(func: Callable[..., Any]) -> Callable[..., Any]: | |
def _func(*args, **kwargs): | |
try: | |
ret = func(*args, **kwargs) | |
except tuple(classes) as err: | |
return err.get_response() | |
else: | |
return ret | |
return _func | |
return _decorator | |