Как намеренно вызвать 400 Bad Request в Python/Flask?

Потребитель моего REST API говорит, что иногда я возвращаю ошибку 400 Bad Request - The request sent by the client was syntactically incorrect..

Журналы моего приложения (Python/Flask), похоже, не фиксируют это, как и журналы моего веб-сервера/Nginx.

Изменить: я хотел бы попытаться вызвать 400 неверных запросов в Flask для целей отладки. Как я могу это сделать?

Следуя совету Джеймса, я добавил что-то похожее на следующее:

@app.route('/badrequest400')
def bad_request():
    return abort(400)

Когда я вызываю это, фляга возвращает следующий HTML, который не использует строку «Запрос, отправленный клиентом, был синтаксически неверным»:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

(Я не уверен, почему он не включает теги <body>.

Мне кажется, что существуют разные варианты сообщения об ошибке 400. Например, если я установлю для файла cookie значение длины 50 000 (используя Interceptor с Postman), вместо этого я получу следующую ошибку от Flask:

<html>
<head>
    <title>Bad Request</title>
</head>
<body>
    <h1>
        <p>Bad Request</p>
    </h1>
Error parsing headers: 'limit request headers fields size'

</body>
</html>

Есть ли способ заставить Flask пройти через различные варианты ошибок 400?


person Matthew Moisen    schedule 01.09.2015    source источник


Ответы (4)


Вы можете использовать abort для вызова ошибки HTTP по коду состояния.

from flask import abort
@app.route('/badrequest400')
def bad_request():
    abort(400)
person James Scholes    schedule 01.09.2015
comment
Привет, Джеймс, спасибо за идею. Однако, когда я это делаю, Flask по умолчанию возвращает следующее описание под 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.. Похоже, что существуют разные типы сообщений об ошибках 400 - например, если я создаю файл cookie с 50000 символов, он завершается с ошибкой 400, но в описании говорится, что это недопустимый заголовок. Любая идея о том, как вызвать синтаксически неправильную версию 400? - person Matthew Moisen; 03.09.2015
comment
Привет, Джеймс, у тебя есть какие-нибудь мысли по поводу моего комментария и обновленного вопроса? - person Matthew Moisen; 27.01.2016
comment
Хотел бы я также вернуть пользовательское сообщение с кодом состояния. - person Kishor Pawar; 20.09.2016

вы можете вернуть код состояния в качестве второго параметра return, см. пример ниже

@app.route('/my400')
def my400():
    code = 400
    msg = 'my message'
    return msg, code
person John    schedule 27.08.2017
comment
Также приятно отметить, что модуль состояния содержит стандартные статусы HTTP. from flask_api import status, а затем просто status.HTTP_200_OK - person VSZM; 24.11.2018

Вы также можете использовать abort с пользовательской ошибкой сообщения:

from flask import abort
abort(400, 'My custom message')

См. https://flask-restplus.readthedocs.io/en/stable/errors.html

person Xtonev    schedule 24.08.2019

Кроме того, вы можете использовать jsonify

from flask import jsonify

class SomeView(MethodView):
    def post(self, *args, **kwargs):
        if "csv_file" not in request.files:
            return jsonify({'errors': 'No csv_file key in request.files.'}), 400
person hernan    schedule 21.08.2020