Как получить сообщение 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 внутри метода колбы?
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=Trueset, theget_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