Это звучит как проблема на стороне клиента.
Клиент, который отправляет данные, должен установить следующий заголовок:
'Content-Type': 'application/json'
В противном случае request.json
возвращает None
, что в вашем коде вызовет abort(400)
.
Если вы не можете внести необходимые изменения на клиенте, вы можете использовать get_json () метод request
и передать force=True
. Если при анализе фактической полезной нагрузки произойдет сбой, возникнет исключение BadRequest
.
Лучший способ написать это было бы:
from flask import jsonify, abort
@app.route('/foo', methods=['POST'])
def foo():
try:
output = request.get_json(force=True)
except:
abort(400)
# output is now a dict of the incoming json payload
print(output)
return jsonify(output)
Затем протестируйте допустимую полезную нагрузку (но заголовок типа контента не задан):
$ curl http://localhost:5000/foo -X POST -d '{"one":"two"}'
{
"one": "two"
}
И недопустимая полезная нагрузка:
$ curl http://localhost:5000/foo -X POST -d '{"one":"two3}'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
? Использование функции колбы jsonify()
для исходящих данных автоматически устанавливает правильные типы содержимого при выходе.
Редактировать , если вы не уверены, какие данные достигают конечной точки и видите только 400 откликов в консоли, то, возможно, попробуйте привести функцию обратно к основам:
@app.route('/foo', methods=['POST'])
def foo():
print(request.get_json(force=True))
return 'works'
Возможно, здесь требуется некоторое тестирование на наличие проб / ошибок. Попытайтесь отправить через систему ifttt
, а также приведенные выше команды curl.