Как получить POSTed JSON во Flask?
Я пытаюсь создать простой API-интерфейс с помощью Flask, в котором я сейчас хочу прочитать POSTed JSON. Я делаю POST с расширением Postman Chrome, а JSON я POST просто {"text":"lalala"}
. Я пытаюсь прочитать JSON, используя следующий метод:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
В браузере он правильно возвращает UUID, который я вставил в GET, но на консоли он просто печатает None
(где я ожидаю, что он распечатает {"text":"lalala"}
. Кто-нибудь знает, как я могу получить опубликовал JSON из метода Flask?
Ответы
Ответ 1
Прежде всего, атрибут .json
- это свойство, которое делегируется методу request.get_json()
, в котором указано, почему вы видите None
здесь.
Вам необходимо установить тип содержимого запроса на application/json
, чтобы свойство .json
и метод .get_json()
(без аргументов) работали, поскольку в противном случае будет получено None
. См. документацию Flask Request
:
Он будет содержать проанализированные данные JSON, если mimetype указывает JSON (application/json, см. is_json()
), в противном случае это будет None
.
Вы можете указать request.get_json()
пропустить требование к типу контента, передав ему аргумент ключевого слова force=True
.
Обратите внимание, что если в этот момент возникает исключение (возможно, приводящее к ответу 400 Bad Request), ваши данные JSON являются недействительными. Это в некотором роде искажено; Вы можете проверить это с помощью валидатора JSON.
Ответ 2
Для справки, здесь полный код для отправки json из клиента Python:
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
print res.json()
Вход "json =" автоматически установит тип содержимого, как описано здесь: Опубликовать JSON с помощью запросов Python
И вышеупомянутый клиент будет работать с этим серверным кодом:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content['mytext']
return jsonify({"uuid":uuid})
if __name__ == '__main__':
app.run(host= '0.0.0.0',debug=True)
Ответ 3
Вот как я бы это сделал, и это должно быть
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.get_json(silent=True)
# print(content) # Do your processing
return uuid
При установленном silent=True
функция get_json
молча завершится ошибкой при попытке получить тело json. По умолчанию установлено значение False
. Если вы всегда ожидаете тело json (не обязательно), оставьте его как silent=False
.
Настройка force=True
будет игнорировать
request.headers.get('Content-Type') == 'application/json'
проверьте, подходит ли вам фляжка. По умолчанию это также установлено на False
.
См. документацию по колбе.
Я настоятельно рекомендую оставить force=False
и заставить клиента отправлять заголовок Content-Type
, чтобы сделать его более явным.
Надеюсь это поможет!
Ответ 4
Предполагая, что вы опубликовали действительный JSON с типом контента application/json
, request.json
будет иметь проанализированные данные JSON.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/echo', methods=['POST'])
def hello():
return jsonify(request.json)
Ответ 5
Мы можем использовать параметры для разрешения данных JSON
import flask
from flask import request, jsonify
import Parameters
application = flask.Flask(__name__)
@application.route('/myappp', methods=['POST'])
@cross_origin('*')
def User_details_by_mailID():
payload = request.get_json()
email = payload[Parameters.email]
return jsonify(email)