플라스크 뷰에서 JSON 응답 반환


464

Pandas로 CSV 파일을 분석하고 요약 정보가있는 dict를 생성하는 기능이 있습니다. Flask보기의 응답으로 결과를 반환하고 싶습니다. JSON 응답을 어떻게 반환합니까?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json

답변:


752

요약 데이터를 jsonify함수에 전달하면 JSON 응답이 리턴됩니다.

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)

Flask 0.11부터 dict뿐만 아니라 모든 JSON 직렬화 가능 유형을 최상위 레벨 오브젝트로 전달할 수 있습니다.


4
현재 플라스크 1.1.0 , 이제 직접 파이썬 딕셔너리를 반환 할 수 있으며, 자동 플라스크에 의해 jsonify'd됩니다.
Adrien Ball

203

jsonify전달한 데이터를 JSON으로 직렬화합니다. 데이터를 직접 직렬화하려면 and jsonify로 응답을 작성하여 수행하는 작업을 수행하십시오 .status=200mimetype='application/json'

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        status=200,
        mimetype='application/json'
    )
    return response

129

키워드 인수를 전달 flask.jsonify하면 JSON 객체로 출력됩니다.

@app.route('/_get_current_user')
def get_current_user():
    return jsonify(
        username=g.user.username,
        email=g.user.email,
        id=g.user.id
    )
{
    "username": "admin",
    "email": "admin@localhost",
    "id": 42
}

이미 dict을 가지고 있다면으로 직접 전달할 수 있습니다 jsonify(d).


에 따라 1.1.0 릴리스 노트, 플라스크는보기 기능에서 사전을 반환 허용한다. 문자열을 반환하면 텍스트 / html 응답이 생성되는 방식과 유사하게 dict를 반환하면 jsonify가 호출되어 응용 프로그램 / json 응답이 생성됩니다.
CodeMantle

34

jsonify어떤 이유로 사용하지 않으려 는 경우 수동으로 수행 할 수 있습니다. flask.json.dumpsJSON 데이터를 작성하기 위해 호출 한 후 application/json컨텐츠 유형 으로 응답을 리턴하십시오 .

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        mimetype='application/json'
    )
    return response

flask.json내장 json모듈 과 다릅니다 . 사용 simplejson가능한 경우 더 빠른 모듈 을 사용하며 Flask 앱과 다양한 통합이 가능합니다.


17

사용자가 업로드 한 파일을 분석하려는 경우 Flask 빠른 시작 은 사용자로부터 파일을 가져오고 액세스하는 방법을 보여줍니다. 파일을 가져 request.files와서 요약 함수에 전달하십시오.

from flask import request, jsonify
from werkzeug import secure_filename

@app.route('/summary', methods=['GET', 'POST'])
def summary():
    if request.method == 'POST':
        csv = request.files['data']
        return jsonify(
            summary=make_summary(csv),
            csv_name=secure_filename(csv.filename)
        )

    return render_template('submit_data.html')

바꾸기 'data'위해 키를 request.files당신의 HTML 형식의 파일 입력의 이름으로.


13

JSON 응답을 반환하고 상태 코드를 설정하려면 다음을 사용할 수 있습니다 make_response.

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)

Flask 이슈 트래커 의이 의견 에서 영감을 얻었습니다 .



10

데코레이터를 사용하여의 결과를 반환합니다 jsonfiy. 뷰에 여러 반환 값이있을 때 더 읽기 쉽다고 생각합니다. 이것은 튜플 반환을 지원하지 않지만 대신 content, status오류 상태 반환을 처리 app.errorhandler합니다.

import functools
from flask import jsonify

def return_json(f):
    @functools.wraps(f)
    def inner(**kwargs):
        return jsonify(f(**kwargs))

    return inner

@app.route('/test/<arg>')
@return_json
def test(arg):
    if arg == 'list':
        return [1, 2, 3]
    elif arg == 'dict':
        return {'a': 1, 'b': 2}
    elif arg == 'bool':
        return True
    return 'none of them'

4

Flask 0.11 이전에는 jsonfiy배열을 직접 반환 할 수 없었습니다. 대신, 목록을 키워드 인수로 전달하십시오.

@app.route('/get_records')
def get_records():
    results = [
        {
          "rec_create_date": "12 Jun 2016",
          "rec_dietary_info": "nothing",
          "rec_dob": "01 Apr 1988",
          "rec_first_name": "New",
          "rec_last_name": "Guy",
        },
        {
          "rec_create_date": "1 Apr 2016",
          "rec_dietary_info": "Nut allergy",
          "rec_dob": "01 Feb 1988",
          "rec_first_name": "Old",
          "rec_last_name": "Guy",
        },
    ]
    return jsonify(results=list)

2

Flask 1.1에서 사전을 반환하면 자동으로 JSON으로 변환됩니다. 경우에 따라서 make_summary()반환 사전 작업을 수행 할 수 있습니다

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d

상태 코드를 포함에 대해 묻는 SO는 이것에 중복으로 폐쇄되었다. 따라서이 질문에 답하기 위해 양식의 튜플을 반환하여 상태 코드를 포함시킬 수 있습니다 (dict, int). 이 dictJSON으로 변환되고 intHTTP 상태 코드가됩니다. 입력이 없으면 상태는 기본값 200입니다. 위의 예에서 코드는 200입니다. 아래 예에서는 201로 변경되었습니다.

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d, 201  # 200 is the default

다음을 사용하여 상태 코드를 확인할 수 있습니다

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"

0

dict이면 플라스크가 직접 반환 할 수 있습니다 (버전 1.0.2)

def summary():
    d = make_summary()
    return d, 200

0

"" " Flask 클래스베이스 뷰 사용 " ""

from flask import Flask, request, jsonify

from flask.views import MethodView

app = Flask(**__name__**)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))

class Summary(MethodView):

    def __init__(self):
        self.response = dict()

    def get(self):
        self.response['summary'] = make_summary()  # make_summary is a method to calculate the summary.
        return jsonify(self.response)

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