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_json
json으로 본문을 검색 할 때 기능이 자동으로 실패합니다. 기본적으로이 설정은 False
입니다. 항상 json 본문 (선택 사항 아님)을 기대하는 경우로 남겨 둡니다 silent=False
.
설정 force=True
은 request.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)