Zwraca odpowiedź JSON z widoku kolby

464

Mam funkcję, która analizuje plik CSV za pomocą Pandas i tworzy dykt z informacjami podsumowującymi. Chcę zwrócić wyniki jako odpowiedź z widoku Flask. Jak zwrócić odpowiedź JSON?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json
Code Ninja
źródło

Odpowiedzi:

752

Przekaż dane podsumowujące do jsonifyfunkcji, która zwraca odpowiedź JSON.

from flask import jsonify

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

Począwszy od Flask 0.11, możesz przekazać dowolny typ serializujący JSON, nie tylko dyktować, jako obiekt najwyższego poziomu.

codegeek
źródło
4
Począwszy od wersji Flask 1.1.0 , możesz teraz bezpośrednio zwrócić dict Pythona, który zostanie automatycznie jsonify'd przez Flask.
Adrien Ball
203

jsonifyserializuje dane, które przekazujesz do JSON. Jeśli chcesz samodzielnie szeregować dane, zrób to jsonify, budując odpowiedź za pomocą status=200i 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
źródło
128

Przekaż argumenty słów kluczowych do, flask.jsonifya zostaną one wygenerowane jako obiekt 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
}

Jeśli masz już dykt, możesz przekazać go bezpośrednio jako jsonify(d).

zengr
źródło
Zgodnie z uwagami do wydania 1.1.0 , Flask umożliwia zwrócenie słownika z funkcji widoku. Podobnie do tego, w jaki sposób zwracanie ciągu spowoduje wygenerowanie odpowiedzi tekstowej / HTML, zwrócenie dykta wywoła polecenie jsonify w celu wygenerowania odpowiedzi aplikacji / json,
CodeMantle
34

Jeśli jsonifyz jakiegoś powodu nie chcesz używać , możesz zrobić to, co robi ręcznie. Zadzwoń, flask.json.dumpsaby utworzyć dane JSON, a następnie zwróć odpowiedź z application/jsontypem treści.

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.jsonróżni się od wbudowanego jsonmodułu. Będzie korzystał z szybszego simplejsonmodułu, jeśli jest dostępny, i umożliwia różne integracje z aplikacją Flask.

Anthony Awuley
źródło
17

Jeśli chcesz przeanalizować plik przesłany przez użytkownika, Szybki start Flask pokazuje, jak uzyskać pliki od użytkowników i uzyskać do nich dostęp. Pobierz plik request.filesi przekaż go do funkcji podsumowania.

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

Zamień 'data'klucz na request.filesna nazwę pliku wejściowego w formularzu HTML.

teechap
źródło
13

Aby zwrócić odpowiedź JSON i ustawić kod stanu, możesz użyć make_response:

from flask import jsonify, make_response

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

Inspiracja zaczerpnięta z tego komentarza w narzędziu do śledzenia problemów Flask.

rubel
źródło
10

Używam dekoratora, aby zwrócić wynik jsonfiy. Myślę, że jest bardziej czytelny, gdy widok ma wiele zwrotów. Nie obsługuje to zwracania krotki content, status, ale app.errorhandlerzamiast tego obsługuję zwracanie stanów błędów .

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
źródło
4

Przed Flask 0.11 jsonfiynie pozwalał bezpośrednio zwrócić tablicy. Zamiast tego przekaż listę jako argument słowa kluczowego.

@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
źródło
2

W Flask 1.1, jeśli zwrócisz słownik i zostanie on automatycznie przekonwertowany na JSON. Jeśli więc make_summary()zwróci słownik, możesz

from flask import Flask

app = Flask(__name__)

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

SO, że pyta o tym kod statusu został zamknięty jako duplikat do tego. Aby odpowiedzieć na to pytanie, możesz dołączyć kod statusu, zwracając krotkę formularza (dict, int). dictPrzekształca JSON i intbędzie kodu stanu HTTP. Bez żadnych danych Status ma domyślną wartość 200. Zatem w powyższym przykładzie kod będzie wynosił 200. W poniższym przykładzie zmieniono go na 201.

from flask import Flask

app = Flask(__name__)

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

Możesz sprawdzić kod stanu za pomocą

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
Steven C. Howell
źródło
0

jeśli to dykt, kolba może zwrócić go bezpośrednio (wersja 1.0.2)

def summary():
    d = make_summary()
    return d, 200
c8999c 3f964f64
źródło
0

„” „ Korzystanie z widoku podstawowego klasy 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)
Manish Sharma
źródło