Trả về phản hồi JSON từ chế độ xem Flask


464

Tôi có một chức năng phân tích tệp CSV với Pandas và tạo ra một lệnh với thông tin tóm tắt. Tôi muốn trả về 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?

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

Câu trả lời:


753

Truyền dữ liệu tóm tắt cho jsonifyhàm, trả về phản hồi 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ể vượt qua bất kỳ loại tuần tự hóa JSON nào, không chỉ là dict, như là đối tượng cấp cao nhất.


4
Kể từ Flask 1.1.0 , giờ đây bạn có thể trực tiếp trả về một lệnh python và nó sẽ được Flask tự động jsonify'd.
Bóng Adrien

203

jsonifytuần tự hóa dữ liệu bạn chuyển nó sang JSON. Nếu bạn muốn tự tuần tự hóa dữ liệu, hãy làm những gì jsonifybằng cách xây dựng một phản hồ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

129

Truyền đối số từ khóa cho flask.jsonifyvà chúng sẽ được xuất ra dưới dạng đố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": "admin@localhost",
    "id": 42
}

Nếu bạn đã có một lệnh, bạn có thể chuyển trực tiếp dưới dạng jsonify(d).


1
Theo ghi chú phát hành 1.1.0 , Flask cho phép trả về một từ điển từ chức năng xem. Tương tự như cách trả về chuỗi sẽ tạo ra phản hồi văn bản / html, trả về một lệnh sẽ gọi jsonify để tạo phản hồi ứng dụng / json,
CodeMantle

34

Nếu bạn không muốn sử dụng jsonifyvì một số lý do, bạn có thể làm những gì nó làm bằng tay. Gọi flask.json.dumpsđể tạo dữ liệu JSON, sau đó trả về phản hồi với application/jsonloại nội dung.

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.jsonlà khác biệt với các jsonmô-đun tích hợp. Nó sẽ sử dụng simplejsonmô-đun nhanh hơn nếu có và cho phép tích hợp nhiều ứng dụng Flask khác nhau.


17

Nếu bạn muốn phân tích một tệp được người dùng tải lên, phần khởi động nhanh Flask chỉ ra cách lấy tệp từ người dùng và truy cập chúng. Lấy tập tin từ request.filesvà chuyển nó đến chức năng tóm tắt.

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ế 'data'khóa request.filesbằng tên của đầu vào tệp ở dạng HTML của bạn.


13

Để trả về phản hồi JSON và đặt mã trạng thái, bạn có thể sử dụng make_response:

from flask import jsonify, make_response

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

Cảm hứng lấy từ nhận xét này trong trình theo dõi vấn đề Flask.



10

Tôi sử dụng một trang trí để trả về kết quả của jsonfiy. Tôi nghĩ rằng nó dễ đọc hơn khi một khung nhìn có nhiều lợi nhuận. Điều này không hỗ trợ trả về một tuple như thế content, status, nhưng app.errorhandlerthay vào đó tôi xử lý trả về các trạng thái lỗi .

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

Trước Flask 0.11, jsonfiysẽ không cho phép trả về một mảng trực tiếp. Thay vào đó, vượt qua danh sách như một đối số từ khóa.

@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

Trong Flask 1.1, nếu bạn trả về một từ điển và nó sẽ tự động được chuyển đổi thành JSON. Vì vậy, nếu make_summary()trả về một từ điển, bạn có thể

from flask import Flask

app = Flask(__name__)

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

Các SO rằng yêu cầu về bao gồm các mã trạng thái đã được đóng cửa như là một bản sao đến thế này. Vì vậy, để trả lời câu hỏi đó, bạn có thể bao gồm mã trạng thái bằng cách trả về một tuple của biểu mẫu (dict, int). Cái dictđược chuyển đổi thành JSON và intsẽ là Mã trạng thái HTTP. Không có bất kỳ đầu vào nào, Trạng thái là mặc định 200. Vì vậy, trong ví dụ trên, mã sẽ là 200. Trong ví dụ bên dưới, nó được đổi thành 201.

from flask import Flask

app = Flask(__name__)

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

Bạn có thể kiểm tra mã trạng thái bằng cách sử dụng

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

0

nếu là dict, bình có thể trả lại trực tiếp (Phiên bản 1.0.2)

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

0

"" " Sử dụng Chế độ xem cơ sở lớp 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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.