В соответствии с документом о состоянии колбы, он вызывает функцию 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 (), отличается от пользовательского исключения, которое я поднял из модели. Не в состоянии найти какое-либо решение для этого. Любые мысли по решению этой проблемы или любой другой подход, которым я могу следовать ??