Обработчик ошибок Flask 400 не запускается из-за неправильного синтаксиса HTTP-запроса

#python #flask

#python #flask

Вопрос:

У меня есть приложение flask, которое получает неверные запросы от другого программного обеспечения. Я хотел бы вручную обрабатывать эти запросы, поскольку затем я все равно могу вызывать соответствующие функции. Пример неправильного запроса выглядит следующим GET GET / HTTP/1.1 образом с дополнительным GET впереди

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

 from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello, World!'


@app.errorhandler(400)
def handle_bad_request(e):
    print('Custom handler active')
    return 'bad request!', 400


if __name__ == '__main__':
    app.run()'
 

Я использовал Packetsender для отправки подобных ошибочных запросов, а Flask получает их и использует обработчик ошибок по умолчанию, который я вижу в своей консоли:

 127.0.0.1 - - [18/Jan/2021 17:49:28] code 400, message Bad request syntax ('GET GET / HTTP/1.1')
127.0.0.1 - - [18/Jan/2021 17:49:28] "GET GET / HTTP/1.1" HTTPStatus.BAD_REQUEST
 

Итак, почему мой пользовательский обработчик ошибок не используется? Это как-то связано со смехотворно неправильным синтаксисом запросов? Любая обратная связь была бы полезна

Ответ №1:

Обработчики ошибок предназначены для необработанных ошибок в коде приложения. Отправка неправильного HTTP-запроса вызывает ошибку на уровне HTTP-сервера (сервер разработки Werkzeug в вашем случае или HTTP-сервер, такой как Nginx в производстве). У Flask или любого другого приложения WSGI нет возможности обрабатывать ошибки, которые вы видите, поскольку запрос недействителен, поэтому он не попадает на уровень приложения.