Flask görünümünden JSON yanıtı döndürme


464

Pandalar ile bir CSV dosyasını analiz ve özet bilgileri ile bir diksiyon üreten bir işlevi var. Sonuçları Flask görünümünden yanıt olarak döndürmek istiyorum. JSON yanıtını nasıl döndürürüm?

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

Yanıtlar:


753

Özet verilerini jsonifybir JSON yanıtı döndüren işleve iletin.

from flask import jsonify

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

Flask 0.11'den itibaren, üst düzey nesne olarak sadece dikte etmek yerine JSON serileştirilebilir herhangi bir türü geçirebilirsiniz.


4
İtibariyle Flask 1.1.0 , artık doğrudan bir piton dicti döndürebilir ve otomatik Flask tarafından jsonify'd edilecektir.
Adrien Ball

204

jsonifyJSON'a ilettiğiniz verileri serileştirir. Verileri kendiniz serileştirmek istiyorsanız ve jsonifyile bir yanıt oluşturarak ne yapın .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

Anahtar kelime bağımsız değişkenlerini iletin flask.jsonifyve bunlar bir JSON nesnesi olarak çıkarılır.

@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
}

Zaten bir kararınız varsa, doğrudan olarak iletebilirsiniz jsonify(d).


1
Gereğince 1.1.0 sürüm notları, Flask bir görünüm işlevinden bir sözlük dönülür. Bir dizenin döndürülmesinin nasıl bir metin / html yanıtı üreteceğine benzer şekilde, bir diksiyon döndürmek bir uygulama / json yanıtı üretmek için jsonify'ı çağırır,
CodeMantle

34

Herhangi bir jsonifynedenle kullanmak istemiyorsanız , manuel olarak ne yapabilirsiniz. flask.json.dumpsJSON verileri oluşturmak için arayın , ardından application/jsoniçerik türüyle bir yanıt döndürün .

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.jsonyerleşik jsonmodülden farklıdır . simplejsonVarsa daha hızlı modülü kullanır ve Flask uygulamanızla çeşitli entegrasyonlar sağlar.


17

Kullanıcı tarafından yüklenen bir dosyayı analiz etmek isterseniz, Flask hızlı başlatma, kullanıcılardan nasıl dosya alınacağına ve dosyalara nasıl erişileceğini gösterir. Dosyayı alın request.filesve özet işlevine iletin.

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'Anahtarını request.filesHTML formunuzdaki dosya girişinin adıyla değiştirin .


14

Bir JSON yanıtı döndürmek ve bir durum kodu ayarlamak için aşağıdakileri kullanabilirsiniz make_response:

from flask import jsonify, make_response

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

Flask sorunu izleyicisindeki bu yorumdan ilham alındı .



10

Sonucu döndürmek için bir dekoratör kullanıyorum jsonfiy. Bir görünümün birden fazla dönüşü olduğunda daha okunabilir olduğunu düşünüyorum. Bu gibi bir tuple döndürmeyi desteklemiyor content, status, ancak app.errorhandlerbunun yerine dönen hata durumlarını ele alıyorum .

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'den önce, jsonfiybir dizinin doğrudan döndürülmesine izin vermezdi. Bunun yerine, listeyi anahtar kelime bağımsız değişkeni olarak iletin.

@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'de, bir sözlük döndürürseniz ve otomatik olarak JSON'a dönüştürülürse. Yani make_summary()bir sözlük döndürürse,

from flask import Flask

app = Flask(__name__)

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

Durum kodu dahil sorar SO buna kopyası olarak kapatıldı. Bu soruyu da yanıtlamak için formun bir demetini döndürerek durum kodunu ekleyebilirsiniz (dict, int). Bu dict, JSON'a dönüştürülür ve intHTTP Durum Kodu olur. Herhangi bir girdi olmadan, Durum varsayılan 200'dür. Dolayısıyla yukarıdaki örnekte kod 200 olacaktır. Aşağıdaki örnekte 201 olarak değiştirilmiştir.

from flask import Flask

app = Flask(__name__)

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

Durum kodunu kullanarak

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

0

eğer bu bir dikte ise, şişe doğrudan iade edebilir (Sürüm 1.0.2)

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

0

"" " Flask Sınıf Taban Görünümünü Kullanma " ""

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)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.