问题:从Flask视图返回JSON响应
我有一个函数,可使用Pandas分析CSV文件并生成带有摘要信息的字典。我想从Flask视图返回结果作为响应。如何返回JSON响应?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
回答 0
将摘要数据传递给该jsonify
函数,该函数返回JSON响应。
from flask import jsonify
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d)
从Flask 0.11开始,您可以将任何JSON可序列化的类型(不仅是dict)传递为顶级对象。
回答 1
jsonify
序列化您传递给JSON的数据。如果您想自己序列化数据,请jsonify
使用status=200
和构建响应以执行操作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
回答 2
将关键字参数传递给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)
。
回答 3
如果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应用进行各种集成。
回答 4
如果您要分析用户上传的文件,则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')
将'data'
键替换为request.files
HTML表单中输入的文件名。
回答 5
要返回JSON响应并设置状态代码,您可以使用make_response
:
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return make_response(jsonify(d), 200)
Flask问题跟踪器中此注释的启发。
回答 6
从版本1.1.0 Flask开始,如果视图返回dict,它将被转换为JSON response。
@app.route("/users", methods=['GET'])
def get_user():
return {
"user": "John Doe",
}
回答 7
我使用装饰器返回的结果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'
回答 8
在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)
回答 9
在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状态代码。没有任何输入,状态是默认的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"
回答 10
如果是字典,则flask可以直接将其返回(版本1.0.2)
def summary():
d = make_summary()
return d, 200
回答 11
“”“ 使用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)
回答 12
烧瓶1.1.x
现在Flask支持请求直接通过json返回,不再需要jsonify
@app.route("/")
def index():
return {
"api_stuff": "values",
}
相当于
@app.route("/")
def index():
return jsonify({
"api_stuff": "values",
})
有关更多信息,请在此处阅读https://medium.com/octopus-wealth/returning-json-from-flask-cf4ce6fe9aeb和https://github.com/pallets/flask/pull/3111