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


326

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을 얻는 방법을 아는 사람이 있습니까?

답변:


427

우선, .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 유효성 검사기를 사용하여 확인할 수 있습니다.


때 나는 생각했다 예외가 500 내부 오류 응답이 점은해야 가능성이 결과에서 발생 그렇지?
iBug

100

참고로 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)

71

이것이 내가 할 방식이며

@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더 명확하게하기 위해 헤더를 보내도록 강력히 권장 합니다.

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


2
json 본체가 선택적인지 여부에 따라 다르므로 귀하의 경우에 따라 다릅니다
radtek

2
유효한 json을 게시하고 다른 시간에 유효하지 않은 json을 게시하는 것이 의미가있는 경우를 볼 수 없습니다. 두 개의 서로 다른 종점처럼
들립니다

1
내가 말했듯이, 엔드 포인트가 "선택적"json body를 사용하면을 사용할 수 있습니다 silent=True. 예, 가능합니다. 사용합니다. 실제로 소비하도록 API를 디자인하는 방법을 기반으로합니다. 엔드 포인트와 같은 경우가없는 경우 silent=True이를 제거 하거나 명시 적으로 설정하십시오 False.
radtek

명확성을 위해 print(content)after content = request.get_json()는 객체를 인쇄하지만 유효한 JSON 객체는 아니지만 유효한 JSON 객체로 인쇄합니다. 예를 들어 JSON은 작은 따옴표를 사용하지만 JSON은 키 값 (문자열) 모두에 대해 큰 따옴표를 문자열 값으로 엄격하게 요구합니다. JSON 표현을 원하면 json.dumps()객체와 함께 사용 하십시오.
Jochem Schulenklopper

24

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)

3
이 답변에 추가하기 위해이 엔드 포인트로 보낼 수있는 요청은 일 수 있습니다 response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"}). 이 실행에 이어 response.json()반환해야합니다{'foo': 'bar'}
ScottMcC

{'foo': 'bar'}유효하지 않은 JSON 임을 알 수 있습니다 . JSON과 매우 유사한 유효한 Python 객체 표현 일 수 있지만 유효한 JSON은 큰 따옴표를 엄격하게 사용합니다.
Jochem Schulenklopper

@JochemSchulenklopper 요청 get_json()메소드 JSON에서 Python 객체로 디코딩 됩니다 . 유효한 JSON 문서를 생성 할 것으로 예상되는 곳은 어디입니까?
Martijn Pieters

@MartijnPieters, 나는 적어도 두 번 이상 물린 특이성에 대해 진술하고있었습니다. 그러나 일반적으로 함수 는 Python dict가 아닌 유효한 JSON 객체 표현을 호출 .json()하거나 .get_json()반환 할 것으로 기대합니다 . 나는 단지 그 이름을보고 있으며, 그 이름에서 나오는 것이 무엇인지 유추합니다.
Jochem Schulenklopper 19:01에

5

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

아약스 전화 : 여기에 키는 사용하는 것입니다 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()

1
이것은 나를 위해 일한 것입니다, 고마워요! :)
vjjj

1

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

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)

0

유효한 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)

0

force 매개 변수를 사용하십시오 ...

request.get_json(force = True)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.