簡體   English   中英

從 Flask 視圖返回 JSON 響應

[英]Return JSON response from Flask view

我有一個 function ,它使用 Pandas 分析 CSV 文件並生成帶有摘要信息的字典。 我想將結果作為 Flask 視圖的響應返回。 如何返回 JSON 響應?

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

從 Flask 1.1.0 開始,視圖可以直接返回 Python dict,Flask 會自動調用jsonify

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

如果您的 Flask 版本低於 1.1.0 或要返回不同的 JSON 可序列化對象,請導入並使用jsonify

from flask import jsonify

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

jsonify將您傳遞給 JSON 的數據序列化。 如果您想自己序列化數據,請通過使用status=200mimetype='application/json'構建響應來執行jsonify的操作。

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

將關鍵字參數傳遞給flask.jsonify ,它們將作為 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
}

如果你已經有一個字典,你可以直接將它作為jsonify(d)傳遞。

如果您出於某種原因不想使用jsonify ,您可以手動執行它的操作。 調用flask.json.dumps創建 JSON 數據,然后返回application/json內容類型的響應。

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.json與內置的json模塊不同。 如果可用,它將使用更快的simplejson模塊,並啟用與您的 Flask 應用程序的各種集成。

要返回 JSON 響應並設置狀態代碼,您可以使用make_response

from flask import jsonify, make_response

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

靈感來自 Flask 問題跟蹤器中的此評論

從版本 1.1.0 Flask 開始, 如果視圖返回一個 dict ,它將被轉換為 JSON response

@app.route("/users", methods=['GET'])
def get_user():
    return {
        "user": "John Doe",
    }

如果你想分析用戶上傳的文件,Flask快速入門展示了如何從用戶那里獲取文件並訪問它們。 request.files中獲取文件並將其傳遞給摘要函數。

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

request.files'data'鍵替換為 HTML 表單中輸入的文件名。

Flask 1.1.x 支持在不調用jsonify的情況下返回 JSON dict。 如果你想返回一個字典以外的東西,你仍然需要調用jsonify

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }

相當於

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })

請參閱添加此內容的拉取請求: https ://github.com/pallets/flask/pull/3111

我使用裝飾器返回jsonfiy的結果。 我認為當一個視圖有多個返回時它更具可讀性。 這不支持返回像content, status這樣的元組,但我用app.errorhandler處理返回錯誤狀態。

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'

在 Flask 0.11 之前, jsonfiy不允許直接返回數組。 相反,將列表作為關鍵字參數傳遞。

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

在 Flask 1.1 中,如果你返回一個字典,它會自動轉換成 JSON。 所以如果make_summary()返回一個字典,你可以

from flask import Flask

app = Flask(__name__)

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

詢問包含狀態代碼的 SO已作為副本關閉。 因此,為了回答這個問題,您可以通過返回(dict, int)形式的元組來包含狀態代碼。 dict轉換為 JSON, int將是 HTTP 狀態代碼。 沒有任何輸入,Status 是默認的 200。因此在上面的示例中,代碼將為 200。在下面的示例中,它更改為 201。

from flask import Flask

app = Flask(__name__)

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

您可以使用檢查狀態代碼

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

使用 Flask 的基於類的視圖時,答案是一樣的。

from flask import Flask, request, jsonify
from flask.views import MethodView

app = Flask(__name__)

class Summary(MethodView):
    def get(self):
        d = make_summary()
        return jsonify(d)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))

如果它是一個字典,flask 可以直接返回它(版本 1.0.2)

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

要序列化對象,請使用flask模塊中的jsonify來對對象進行 jsonify,默認情況下會序列化字典。 此外,如果您正在處理文件,您可以隨時使用make_response

我喜歡這種方式:

    @app.route("/summary")
    def summary():
        responseBody = { "message": "bla bla bla", "summary": make_summary() }
        return make_response(jsonify(responseBody), 200)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM