Пользовательский ответ во время исключения промежуточного программного обеспечения сокола

Я пишу Falcon промежуточное ПО для моего приложения. Когда я получаю какие-либо ошибки, я хочу вызвать ошибку, прервать процесс и вернуть свой пользовательский ответ, который выглядит следующим образом:

{
   "status": 503,
   "message": "No Token found. Token is required."
}

Но стандарт Falcon Реализация ошибок не позволяет мне устанавливать настраиваемые поля для моего ответа.

Как решить эту проблему наиболее правильно?

4 ответа

Решение

После долгого времени я решил эту проблему таким интересным способом. Я поместил свой код в блок try/catch, и когда ошибка обнаружена, я решил не повышать Falcon ошибка, и просто попытался написать return Ключевое слово после установки статуса ответа и тела, потому что метод void, так что ничего не возвращает. Теперь это выглядит так:

resp.status = falcon.HTTP_403
resp.body = body

return

Я все еще искал пример, и вот для тех, кто все еще нуждается в этом:

from falcon.http_error import HTTPError

class MyHTTPError(HTTPError):

    """Represents a generic HTTP error.
    """

    def __init__(self, status, error):
        super(MyHTTPError, self).__init__(status)
        self.status = status
        self.error = error

    def to_dict(self, obj_type=dict):
        """Returns a basic dictionary representing the error.
        """
        super(MyHTTPError, self).to_dict(obj_type)
        obj = self.error
        return obj

с помощью:

error = {"error": [{"message": "Auth token required", "code": "INVALID_HEADER"}]}

raise MyHTTPError(falcon.HTTP_400, error)
raise falcon.HTTPError(falcon.HTTP_503, 'No Token found. Token is required.')

Создайте пользовательский класс исключений, описанный в документации по соколам, найдите add_error_handler

class RaiseUnauthorizedException(Exception):
    def handle(ex, req, resp, params):
        resp.status = falcon.HTTP_401
        response = json.loads(json.dumps(ast.literal_eval(str(ex))))
        resp.body = json.dumps(response)

Добавить пользовательский класс исключений в объект сокола API

api = falcon.API()
api.add_error_handler(RaiseUnauthorizedException)
Другие вопросы по тегам