Как сделать все сообщения об ошибках для доступа API в Content-Type приложения / json вместо Content-Type of text / html in Flask? - PullRequest
0 голосов
/ 28 марта 2020

Я создаю Flask приложение, которое поддерживает доступ пользователей и через API. Путь /api и его подпути предназначены для доступа к API. Весь доступ API должен получить ответ в JSON, т. Е. С Content-Type из application/json.

Я организовал все конечные точки API в чертеже с именем api. Используя технику, показанную в Реализация исключений API , я определил пользовательский класс ошибок с именем ApiAccessError и зарегистрировал обработчик для него в api проекте, поэтому всякий раз, когда ApiAccessError вызывается в функции представления в проекте api зарегистрированный обработчик для ApiAccessError вызывается для генерации ответа JSON с Content-Type из application/json.

Проблема, с которой я сталкиваюсь с текущим проектом, заключается в том, что всякий раз, когда ошибка, которая не является ApiAccessError, возникает при обработке запроса API, ответ на запрос находится не в JSON, а в HTML, т.е. имеет Content-Type из text/html. Такая ошибка может возникнуть, например, при доступе к конечной точке API GET-only с помощью метода POST. В этом случае ответ сервера находится в HTML с кодом состояния 405. Я хотел бы, чтобы ответ был в JSON при сохранении кода состояния 405. Как можно настроить Flask для ответа на ошибку 405 и все остальные ошибки по умолчанию в JSON вместо HTML при обработке запросов API?

1 Ответ

0 голосов
/ 01 апреля 2020

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

def handle_http_exception(e: HTTPException):
    if request.path.startswith(API_PATH):
        # Start with the response represented by the error
        resp = e.get_response()

        # jsonify the response
        resp.set_data(
            json.dumps(
                {
                    'name': e.name,
                    'err_msg': e.description
                }
            )
        )
        resp.content_type = 'application/json'

        return resp
    else:
        return e

app.register_error_handler(HTTPException, handle_http_exception)

Это работает, потому что, грубо говоря, все ошибки, возникающие в процессе обработки запроса, который является экземпляром Exception, являются либо HTTPException, либо ошибка, которая будет преобразована в HTTPException, если для нее не зарегистрирован обработчик.

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