TypeError: Объект типа CustomException не поддерживает сериализацию в формате JSON - PullRequest
1 голос
/ 10 ноября 2019

В соответствии с документом о состоянии колбы, он вызывает функцию handle_error () при любой ошибке 400 или 500, возникающей на маршруте Flask-RESTful. Поэтому я попытался обработать исключения в моем приложении с помощью этого обратного вызова, полагая, что это будет использовать несколько блоков try catch в моем приложении. Но при вызове пользовательского исключения (ResourceNotFound) из модели возникает другое исключение TypeError: Object of type ResourceNotFound is not JSON serializable

from werkzeug.exceptions import HTTPException
from flask_restful import Api
class ExtendedAPI(Api):
    def handle_error(self, err):
        """
        This class overrides 'handle_error' method of 'Api' class ,
        to extend global exception handing functionality of 'flask-restful'
        and helps preventing writing unnecessary
        try/except block though out the application
        """
        # import pdb; pdb.set_trace()
        logger.error(err)
        # Handle HTTPExceptions
        if isinstance(err, HTTPException):
            return jsonify({
                'message': getattr(
                    err, 'description', HTTP_STATUS_CODES.get(err.code, '')
                )
            }), err.code
        if isinstance(err, ValidationError):
            resp = {
                'success': False,
                'errors': err.messages
            }
            return jsonify(resp), 400
        # If msg attribute is not set,
        # consider it as Python core exception and
        # hide sensitive error info from end user
        # if not getattr(err, 'message', None):
        #     return jsonify({
        #         'message': 'Server has encountered some error'
        #     }), 500
        # Handle application specific custom exceptions
        return jsonify(**err.kwargs), err.http_status_code

Пользовательское исключение:

class Error(Exception):
    """Base class for other exceptions"""
    def __init__(self, http_status_code: int, *args, **kwargs):
        # If the key `msg` is provided, provide the msg string
        # to Exception class in order to display
        # the msg while raising the exception
        self.http_status_code = http_status_code
        self.kwargs = kwargs
        msg = kwargs.get('msg', kwargs.get('message'))
        if msg:
            args = (msg,)
            super().__init__(args)
        self.args = list(args)
        for key in kwargs.keys():
            setattr(self, key, kwargs[key])


class ResourceNotFound(Error):
    """Should be raised in case any resource is not found in the DB"""

Функция handle_error обрабатывает HTTPException, ошибки проверки зефира и последниезаявление для обработки моих пользовательских исключений. но, используя pdb, я увидел, что объект err, полученный handle_error (), отличается от пользовательского исключения, которое я поднял из модели. Не в состоянии найти какое-либо решение для этого. Любые мысли по решению этой проблемы или любой другой подход, которым я могу следовать ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...