2012-10-26 12 views
210

Mam funkcję, która analizuje plik CSV z Pand i tworzy dict z informacjami podsumowującymi. Chcę zwrócić wyniki w odpowiedzi z widoku kolby. Jak mogę zwrócić odpowiedź JSON?Powrót Odpowiedź JSON z widoku kolby

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

Odpowiedz

353

przekazać dane podsumowujące funkcji jsonify, która zwraca odpowiedź JSON.

from flask import jsonify 

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

Jak Kolba 0,11, można przekazać dowolny typ JSON serializacji, nie tylko DICT, jak najwyższym poziomie obiektu.

79

słów kluczowych przekazywać argumenty do flask.jsonify i będą wyprowadzane 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": "[email protected]", 
    "id": 42 
} 
+0

można proszę mi opracować z kodem do identyfikacji pliku. –

+0

@CodeNinja Co masz na myśli? Jeśli chcesz wprowadzić 'f' dict z oryginalnego kodu, powinieneś zrobić' return jsonify (** f) '. –

+1

Co jeśli chcę zwrócić strukturę taką jak '{'names': {'first': 'Frank', last: 'Sinatra'}, 'age': 98}'? –

14

Jeśli chcesz przeanalizować plik przesłany przez użytkownika, Flask quickstart pokazuje, jak pobierać pliki od użytkowników i uzyskiwać do nich dostęp. Pobierz plik z numeru request.files i 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') 

Wymienić klucz 'data' dla request.files z nazwą pliku wejściowego z formularza HTML.

106

jsonify serializuje dane przekazywane do JSON. Jeśli chcesz samodzielnie szeregować dane, wykonaj to, co robi jsonify, budując odpowiedź za pomocą status=200 i 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 
+0

@Tjorriemorrie Może nie chcę listy najwyższego poziomu. Zobacz http: // stackoverflow.com/questions/3503102/what-are-top-level-json-arrays-and-why-are-a-a-security-risk – rob

+5

możesz zwrócić kod statusu z jsonify też 'return jsonify ({" Error ":" Access restricted "}), 403' – naXa

-2

Jak powiedział wcześniej jsonify jest najlepszym sposobem, albo można też użyć skrzynkowego odpowiedzi "pakiet na https://github.com/Parkayun/flask-responses

@app.route("/json") 
def hello(): 
    return json_response(your_dict, status_code=201) 
2

Chociaż flask.jsonify jest łatwy w użyciu, ale wolę używać dekorator do return json. Pomaga zwrócić dowolny typ json i jest bardziej czytelny, gdy masz wiele zwrotów w swojej metodzie. (Zauważ, że próbka ta działa na 200 odpowiedzi, wracam błędy z podnoszeniem wyjątków i Flask.errorhandler)

def return_json(f): 
    @functools.wraps(f) 
    def inner(*a, **k): 
     return json.dumps(f(*a, **k)) 
    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 'non of them' 
+5

Nie jestem pewien, ale spowoduje to zwrot niewłaściwego typu MIME (" html/text "zamiast" application/json "). – gdoumenc

0

chociaż stare pytanie, myślałem, dodam to, czy ktoś patrzy zwraca tablicę JSONs . Flask 0.10 pozwala ci to zrobić i jest całkiem prosty.

@app.route('/get_records') 
def get_records(): 
    list = [ 
     { 
      "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) 
+1

To nie różni się od istniejących odpowiedzi. – davidism

+0

nie wiesz, która część _ "jeśli ktoś chce zwrócić ** tablicę JSON **" _ nie było tam jasne. –

+1

'jsonify' działa z każdym typem, zwrócenie listy nie gwarantuje nowej odpowiedzi. Nie powiedziałem, że to jest niejasne, powiedziałem, że to nie jest jedyna odpowiedź. – davidism

0
from flask import json 
from flask import Response 

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

    response = Response(
     response=json.dumps(data), 
     status=200, 
     mimetype='application/json' 
    ) 

    return response