Kembalikan respons JSON dari tampilan Flask

464

Saya memiliki fungsi yang menganalisis file CSV dengan Pandas dan menghasilkan dict dengan informasi ringkasan. Saya ingin mengembalikan hasilnya sebagai tanggapan dari tampilan Flask. Bagaimana cara mengembalikan respons JSON?

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

Jawaban:

753

Berikan data ringkasan ke jsonifyfungsi, yang mengembalikan respons JSON.

from flask import jsonify

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

Pada Flask 0.11, Anda dapat melewati semua jenis JSON-serializable, bukan hanya dict, sebagai objek tingkat atas.

codegeek
sumber
4
Pada Flask 1.1.0 , Anda sekarang dapat langsung mengembalikan dict python, dan itu akan secara otomatis disinkronkan oleh Flask.
Adrien Ball
203

jsonifymembuat serialisasi data yang Anda berikan ke JSON. Jika Anda ingin membuat serialisasi data sendiri, lakukan apa yang jsonifydilakukan dengan membangun respons dengan status=200dan mimetype='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
scls
sumber
129

Lewati argumen kata kunci flask.jsonifydan akan ditampilkan sebagai objek 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
}

Jika Anda sudah memiliki dict, Anda dapat meneruskannya langsung sebagai jsonify(d).

zengr
sumber
1
Sesuai catatan rilis 1.1.0 , Flask memungkinkan pengembalian kamus dari fungsi tampilan. Mirip dengan bagaimana mengembalikan string akan menghasilkan respons teks / html, mengembalikan dict akan memanggil jsonify untuk menghasilkan respons aplikasi / json,
CodeMantle
34

Jika Anda tidak ingin menggunakan jsonifykarena suatu alasan, Anda dapat melakukan apa yang dilakukan secara manual. Panggil flask.json.dumpsuntuk membuat data JSON, lalu kembalikan respons dengan application/jsontipe konten.

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.jsonberbeda dari jsonmodul bawaan. Ini akan menggunakan simplejsonmodul yang lebih cepat jika tersedia, dan memungkinkan berbagai integrasi dengan aplikasi Flask Anda.

Anthony Awuley
sumber
17

Jika Anda ingin menganalisis file yang diunggah oleh pengguna, quickstart Flask menunjukkan cara mendapatkan file dari pengguna dan mengaksesnya. Dapatkan file dari request.filesdan berikan ke fungsi ringkasan.

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')

Ganti 'data'kunci request.filesdengan nama input file dalam formulir HTML Anda.

kantong teh
sumber
13

Untuk mengembalikan respons JSON dan menetapkan kode status yang dapat Anda gunakan make_response:

from flask import jsonify, make_response

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

Inspirasi diambil dari komentar ini dalam pelacak isu Flask.

rubel
sumber
10

Saya menggunakan dekorator untuk mengembalikan hasilnya jsonfiy. Saya pikir ini lebih mudah dibaca ketika tampilan memiliki beberapa pengembalian. Ini tidak mendukung pengembalian tuple like content, status, tetapi saya menangani pengembalian status kesalahan dengan app.errorhandlergantinya.

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'
iman
sumber
4

Sebelum ke Flask 0.11, jsonfiytidak akan memungkinkan pengembalian array secara langsung. Alih-alih, sampaikan daftar sebagai argumen kata kunci.

@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)
mania_device
sumber
2

Di Flask 1.1, jika Anda mengembalikan kamus dan kamus itu akan secara otomatis dikonversi ke JSON. Jadi, jika make_summary()mengembalikan kamus, Anda bisa

from flask import Flask

app = Flask(__name__)

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

The SO yang menanyakan tentang termasuk kode status ditutup sebagai duplikat yang satu ini. Jadi untuk juga menjawab pertanyaan itu, Anda bisa memasukkan kode status dengan mengembalikan tuple formulir (dict, int). Ini dictdikonversi ke JSON dan intakan menjadi Kode Status HTTP. Tanpa input apa pun, Status adalah default 200. Jadi dalam contoh di atas kode akan menjadi 200. Dalam contoh di bawah ini diubah menjadi 201.

from flask import Flask

app = Flask(__name__)

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

Anda dapat memeriksa kode status menggunakan

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
Steven C. Howell
sumber
0

jika ini adalah dict, flask dapat mengembalikannya secara langsung (Versi 1.0.2)

def summary():
    d = make_summary()
    return d, 200
c8999c 3f964f64
sumber
0

"" " Menggunakan Flask Class-base View " ""

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)
Manish Sharma
sumber