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

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.


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

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


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.


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.


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.



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'

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)

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"

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

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.