Câu trả lời:
Truyền dữ liệu tóm tắt cho jsonify
hà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.
jsonify
tuầ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ì jsonify
bằng cách xây dựng một phản hồi với status=200
và 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
Truyền đối số từ khóa cho flask.jsonify
và 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)
.
Nếu bạn không muốn sử dụng jsonify
vì 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/json
loạ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.json
là khác biệt với các json
mô-đun tích hợp. Nó sẽ sử dụng simplejson
mô-đun nhanh hơn nếu có và cho phép tích hợp nhiều ứng dụng Flask khác nhau.
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.files
và 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.files
bằng tên của đầu vào tệp ở dạng HTML của bạn.
Kể từ phiên bản 1.1.0 Flask, nếu một khung nhìn trả về một lệnh, nó sẽ được chuyển thành phản hồi JSON .
@app.route("/users", methods=['GET'])
def get_user():
return {
"user": "John Doe",
}
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.errorhandler
thay 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'
Trước Flask 0.11, jsonfiy
sẽ 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)
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à int
sẽ 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"
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
"" " 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)
Bình 1.1.x
bây giờ Flask hỗ trợ yêu cầu trả lại trực tiếp với json, không yêu cầu jsonify nữa
@app.route("/")
def index():
return {
"api_stuff": "values",
}
tương đương với
@app.route("/")
def index():
return jsonify({
"api_stuff": "values",
})
để biết thêm thông tin đọc tại đây https://medium.com/octopus-wealth/retinating-json-from-flask-cf4ce6fe9aeb và https://github.com/pallets/flask/pull/3111