2012-10-26 41 views
210

Tôi có chức năng phân tích tệp CSV với Pandas và tạo ra một thông tin tóm tắt có thông tin tóm tắt. Tôi muốn trả lại kết quả dưới dạng phản hồi từ chế độ xem Flask. Làm cách nào để trả về phản hồi JSON?Trả lại phản hồi JSON từ chế độ xem Flask

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

Trả lời

353

Vượt qua dữ liệu tóm tắt cho jsonify chức năng, mà trả về một phản ứng JSON.

from flask import jsonify 

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

Kể từ Flask 0.11, bạn có thể chuyển bất kỳ loại có thể tuần tự JSON nào, không chỉ là dict, làm đối tượng cấp cao nhất.

79

đối số từ khóa Pass để flask.jsonify và họ sẽ được xuất ra như một đối tượng 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

bạn có thể xin hãy giải thích cho tôi với mã để xác định tên tập tin. –

+0

@CodeNinja Ý của bạn là gì? Nếu bạn muốn putput 'f' dict từ mã ban đầu của bạn, bạn nên làm' return jsonify (** f) '. –

+1

Nếu tôi muốn trả về cấu trúc như '{'name': {'first': 'Frank', cuối cùng: 'Sinatra'}, 'age': 98}'? –

14

Nếu bạn muốn phân tích tệp do người dùng tải lên, Flask quickstart cho biết cách tải tệp từ người dùng và truy cập chúng. Lấy tập tin từ request.files và chuyển nó đến hàm tổng hợp.

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

Thay thế phím 'data' cho request.files với tên của tập tin đầu vào ở dạng HTML của bạn.

106

jsonify serializes dữ liệu bạn chuyển nó vào JSON. Nếu bạn muốn tự tuần tự hóa dữ liệu, hãy làm những gì jsonify thực hiện bằng cách tạo câu trả lời với 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 
+0

@Tjorriemorrie Có thể không muốn danh sách cấp cao nhất. Xem http: // stackoverflow.com/questions/3503102/what-are-top-level-json-array-và-why-are-them-an-security-risk – rob

+5

bạn có thể trả về mã trạng thái với jsonify quá 'return jsonify ({" Error ":" Truy cập bị hạn chế "}), 403' – naXa

-2

Giống như nói trước đây jsonify là cách tốt nhất hoặc bạn cũng có thể sử dụng Flask-phản ứng 'gói tại https://github.com/Parkayun/flask-responses

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

Mặc dù flask.jsonify rất dễ sử dụng nhưng tôi thích sử dụng một trang trí để trả lại json. Nó giúp trả về bất kỳ loại json nào và dễ đọc hơn khi bạn có nhiều trả về trong phương thức của mình. (Lưu ý rằng mẫu này làm việc cho 200 phản ứng, tôi quay trở lại với lỗi ngoại lệ huy động và 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

Không chắc chắn nhưng điều này sẽ trả lại một mimetype sai ('html/text' thay vì 'application/json') – gdoumenc

0

Mặc dù là một câu hỏi cũ, tôi nghĩ rằng tôi sẽ thêm này nếu có ai đang tìm cách để trả về một mảng của JSONs . Flask 0.10 cho phép bạn làm điều này và nó khá đơn giản.

@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

Điều này không khác với câu trả lời hiện có. – davidism

+0

không chắc chắn phần nào của _ "nếu có ai muốn trả về một mảng ** của JSON **" _ không rõ ràng ở đó. –

+1

'jsonify' hoạt động với bất kỳ loại nào, trả về một danh sách không đảm bảo câu trả lời mới. Tôi không nói nó không rõ ràng, tôi nói đó không phải là câu trả lời duy nhất. – 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 
Các vấn đề liên quan