Как получить 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)