Как получить сообщение json в колбе?



Я пытаюсь построить простой API с помощью Flask, в котором я теперь хочу прочитать некоторые опубликованные JSON. Я делаю пост с почтальон Chrome расширение, и сообщение JSON I просто {"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 внутри метода колбы?

590   4  

4 ответов:

вы должны установить тип контента запроса в application/json на .json свойство для работы; это будет None в противном случае. Смотрите колбы Request документация:

если mimeType application/json Это будет содержать проанализированные данные JSON. Иначе это будет None.

колба 0.10 добавил request.get_json() метод, и вы должны использовать этот метод вместо .json собственность. Вы можете указать метод, чтобы пропустить требование к типу контента путем установки force=True.

обратите внимание, что если исключение возникает в этот момент (возможно, в результате 400 плохой ответ на запрос), ваш JSON сведения является недействительным. Он каким-то образом искажен; вы можете проверить его с помощью валидатора JSON.

для справки, вот полный код для отправки 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)

вот как я бы это сделал, и это должно быть

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    print content
    return uuid

С silent=True set, the get_json функции без вмешательства пользователя может прерываться при попытке получить JSON тела. По умолчанию установлено значение False. Установка force=True игнорировать request.headers.get('Content-Type') == 'application/json' проверьте, что колба делает для вас. По умолчанию также установлено значение False. Смотрите фляга документации.

я настоятельно рекомендую оставить force=False и заставить клиента отправить сделать это более четкий.

надеюсь, что это помогает!

Это решение работает:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['POST'])
def hello():
   return jsonify(request.json)

Comments

    Ничего не найдено.