ส่งคืนการตอบกลับ JSON จากมุมมอง Flask


464

ฉันมีฟังก์ชั่นที่วิเคราะห์ไฟล์ CSV ด้วย Pandas และสร้าง dict พร้อมข้อมูลสรุป ฉันต้องการส่งคืนผลลัพธ์เป็นการตอบกลับจากมุมมอง Flask ฉันจะส่งคืนการตอบกลับ JSON ได้อย่างไร?

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

คำตอบ:


753

ส่งผ่านข้อมูลสรุปไปยังjsonifyฟังก์ชันซึ่งส่งคืนการตอบกลับ JSON

from flask import jsonify

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

ในฐานะ Flask 0.11 คุณสามารถผ่านประเภทใดก็ได้ที่สามารถต่อเนื่องได้ของ JSON ไม่ใช่แค่ dict เป็นวัตถุระดับสูงสุด


4
ในฐานะของFlask 1.1.0ตอนนี้คุณสามารถคืนค่า pict dython โดยตรงและมันจะถูก jsonify'd โดย Flask โดยอัตโนมัติ
Adrien Ball

203

jsonifyจัดลำดับข้อมูลที่คุณส่งให้ JSON หากคุณต้องการเป็นอันดับข้อมูลที่ตัวเองทำในสิ่งที่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 Flask อนุญาตให้ส่งคืนพจนานุกรมจากฟังก์ชันมุมมอง คล้ายกับวิธีการส่งคืนสตริงจะสร้างการตอบกลับข้อความ / html การคืนค่า dict จะเรียก jsonify เพื่อสร้างการตอบกลับของแอปพลิเคชัน / json
CodeMantle

34

หากคุณไม่ต้องการใช้jsonifyด้วยเหตุผลบางอย่างคุณสามารถทำสิ่งนั้นได้ด้วยตนเอง โทรflask.json.dumpsเพื่อสร้างข้อมูล JSON จากนั้นส่งคืนการตอบกลับด้วย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 quickstartจะแสดงวิธีรับไฟล์จากผู้ใช้และเข้าถึงได้ รับไฟล์จาก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

ก่อนหน้าขวด 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 ที่ถามเกี่ยวกับการรวมทั้งรหัสสถานะที่ถูกปิดเป็นที่ซ้ำกันให้เป็นหนึ่งในนี้ ดังนั้นยังตอบคำถามที่คุณสามารถใส่รหัสสถานะโดยการกลับ tuple (dict, int)ของรูปแบบ dictจะถูกแปลงเป็น JSON และintจะเป็น HTTP รหัสสถานะ สถานะจะเป็นค่าเริ่มต้น 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

"" " การใช้มุมมองคลาสพื้นฐานของขวด " ""

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)

0

กระติกน้ำ 1.1.x

ตอนนี้ขอการสนับสนุน Flask กลับมาพร้อมกับ json โดยตรงjsonifyไม่จำเป็นอีกต่อไป

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }

เทียบเท่ากับ

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })

สำหรับข้อมูลเพิ่มเติมอ่านที่นี่https://medium.com/octopus-wealth/returning-json-from-flask-cf4ce6fe9aebและhttps://github.com/pallets/flask/pull/3111

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.