Возвращение ответа JSON из представления "Флажок"
У меня есть функция, которая анализирует CSV файл с помощью Pandas и создает файл с суммарной информацией. Я хочу вернуть результаты в виде ответа из представления Flask. Как вернуть ответ JSON?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
Ответы
Ответ 1
Передайте сводные данные в функцию jsonify
, которая возвращает ответ JSON.
from flask import jsonify
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d)
Как и Flask 0.11, вы можете передать любой тип JSON-сериализуемого типа, а не только dict, как объект верхнего уровня.
Ответ 2
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
Ответ 3
Передайте аргументы ключевого слова в 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": "[email protected]",
"id": 42
}
Если у вас уже есть dict, вы можете передать его напрямую как jsonify(d)
.
Ответ 4
Если вы по какой-то причине не хотите использовать 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
модуль simplejson
если он доступен, и разрешает различные интеграции с вашим приложением Flask.
Ответ 5
Если вы хотите проанализировать файл, загруженный пользователем, в быстром запуске 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-форму.
Ответ 6
Хотя flask.jsonify
прост в использовании, но я предпочитаю использовать декоратор для возврата json. Это помогает возвращать любой тип json и более читабельно, когда в вашем методе есть несколько возвратов. (обратите внимание, что этот пример работает для 200 ответов, я возвращаю ошибки с повышением исключений и Flask.errorhandler
)
def return_json(f):
@functools.wraps(f)
def inner(*a, **k):
return json.dumps(f(*a, **k))
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 'non of them'
Ответ 7
До 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)
Ответ 8
Чтобы вернуть JSON-ответ и установить код состояния, вы можете вернуть кортеж:
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d), 200
Вдохновение взято из этого комментария в трекере вопросов Flask.
Ответ 9
Если вам нужно вернуть JSON для реализации REST API, вы можете использовать Flask-Restful.
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
Ответ 10
Python Flask JSON:
from flask import Flask, jsonify,request,json
app = Flask(__name__)
country = [
{'name':'india'},
{'name':'pakistian'},
{'name':'US'},
{'name':'UK'},
{'name':'NZ'}
]
@app.route('/', methods=['GET'])
def test():
return jsonify({
'message': 'Hai'
})
@app.route('/country', methods=['GET'])
def countryall():
return jsonify({
'country':country
})
if __name__ == '__main__':
app.run(debug=True, port=8080)
Ответ 11
Как сказано ранее, jsonify является лучшим способом или вы также можете использовать пакет Flask-response "на https://github.com/Parkayun/flask-responses
@app.route("/json")
def hello():
return json_response(your_dict, status_code=201)
Ответ 12
Вы можете попробовать этот подход:
from flask import jsonify, Flask
app = Flask(__name__)
@app.route("/summary")
def summary():
d = make_summary()
return jsonify(d)