[英]Return JSON response from Flask view
我有一個 function ,它使用 Pandas 分析 CSV 文件並生成帶有摘要信息的字典。 我想將結果作為 Flask 視圖的響應返回。 如何返回 JSON 響應?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
jsonify
將您傳遞給 JSON 的數據序列化。 如果您想自己序列化數據,請通過使用status=200
和mimetype='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.