[python] Flask에서 POST 된 JSON을 얻는 방법?

Flask를 사용하여 간단한 API를 작성하려고합니다. 이제 POST 된 JSON을 읽으려고합니다. Postman Chrome 확장 프로그램으로 POST를 수행하고 JSON I POST는 간단 {"text":"lalala"}합니다. 다음 방법을 사용하여 JSON을 읽으려고합니다.

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

브라우저에서 GET에 넣은 UUID를 올바르게 반환하지만 콘솔에서 그냥 인쇄합니다 None(내가 인쇄 할 것으로 예상됩니다 {"text":"lalala"}. Flask 메서드 내에서 게시 된 JSON을 얻는 방법을 아는 사람이 있습니까?



답변

우선, .json속성은 request.get_json()메소드에 위임하는 특성으로 , None여기에 표시되는 이유가 설명되어 있습니다.

당신은에 요청 내용 유형을 설정해야 application/json을 위해 .json재산과 .get_json()하나가 생성되므로 작업에 (인수 없음) 방법 None이 없습니다. 플라스크 Request설명서를 참조하십시오 .

mimetype이 JSON ( application / json , see 참조 is_json())을 나타내는 경우 파싱 된 JSON 데이터가 포함되며 그렇지 않으면입니다 None.

키워드 인수를 request.get_json()전달하여 컨텐츠 유형 요구 사항을 건너 뛰 도록 지시 할 수 있습니다 force=True.

는 IF 것을 참고 예외가 이 시점에서 발생합니다 (아마도 400 잘못된 요청 응답 결과는) 당신의 JSON의 데이터가 유효하지 않습니다. 어떤 식 으로든 변형되었습니다. JSON 유효성 검사기를 사용하여 확인할 수 있습니다.


답변

참고로 Python 클라이언트에서 json을 보내는 방법에 대한 전체 코드는 다음과 같습니다.

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print res.json()

“json =”입력은 다음에 설명 된대로 컨텐츠 유형을 자동으로 설정합니다. Python 요청을 사용하여 JSON 게시

위의 클라이언트는이 서버 측 코드로 작업합니다.

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) # Do your processing
    return uuid

silent=True세트의 get_jsonjson으로 본문을 검색 할 때 기능이 자동으로 실패합니다. 기본적으로이 설정은 False입니다. 항상 json 본문 (선택 사항 아님)을 기대하는 경우로 남겨 둡니다 silent=False.

설정 force=Truerequest.headers.get('Content-Type') == 'application/json'플라스크가 수행 하는 확인을 무시합니다
. 기본적으로이 또한 설정되어 False있습니다.

플라스크 설명서를 참조하십시오 .

force=False클라이언트를 떠나서 Content-Type더 명확하게하기 위해 헤더를 보내도록 강력히 권장 합니다.

도움이 되었기를 바랍니다!


답변

application/json컨텐츠 유형으로 유효한 JSON을 게시했다고 가정하면 request.json구문 분석 된 JSON 데이터가 있습니다.

from flask import Flask, request, jsonify

app = Flask(__name__)


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


답변

아약스 호출에서 문제가 발생한 모든 사람들을 위해 전체 예제는 다음과 같습니다.

아약스 전화 : 여기에 키는 사용하는 것입니다 dict다음과JSON.stringify

    var dict = {username : "username" , password:"password"};

    $.ajax({
        type: "POST",
        url: "http://127.0.0.1:5000/", //localhost Flask
        data : JSON.stringify(dict),
        contentType: "application/json",
    });

그리고 서버 측에서 :

from flask import Flask
from flask import request
import json

app = Flask(__name__)

@app.route("/",  methods = ['POST'])
def hello():
    print(request.get_json())
    return json.dumps({'success':True}), 200, {'ContentType':'application/json'}

if __name__ == "__main__":
    app.run()


답변

다른 접근 방식을 제공합니다.

from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/service', methods=['POST'])
def service():
    data = json.loads(request.data)
    text = data.get("text",None)
    if text is None:
        return jsonify({"message":"text not found"})
    else:
        return jsonify(data)

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)


답변

유효한 JSON을 게시했다고 가정하면,

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['uuid']
    # Return data as JSON
    return jsonify(content)