Yanıtlar:
Özet verilerini jsonify
bir JSON yanıtı döndüren işleve iletin.
from flask import jsonify
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d)
Flask 0.11'den itibaren, üst düzey nesne olarak sadece dikte etmek yerine JSON serileştirilebilir herhangi bir türü geçirebilirsiniz.
jsonify
JSON'a ilettiğiniz verileri serileştirir. Verileri kendiniz serileştirmek istiyorsanız ve jsonify
ile bir yanıt oluşturarak ne yapın .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
Anahtar kelime bağımsız değişkenlerini iletin flask.jsonify
ve bunlar bir JSON nesnesi olarak çıkarılır.
@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
}
Zaten bir kararınız varsa, doğrudan olarak iletebilirsiniz jsonify(d)
.
Herhangi bir jsonify
nedenle kullanmak istemiyorsanız , manuel olarak ne yapabilirsiniz. flask.json.dumps
JSON verileri oluşturmak için arayın , ardından application/json
içerik türüyle bir yanıt döndürün .
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
yerleşik json
modülden farklıdır . simplejson
Varsa daha hızlı modülü kullanır ve Flask uygulamanızla çeşitli entegrasyonlar sağlar.
Kullanıcı tarafından yüklenen bir dosyayı analiz etmek isterseniz, Flask hızlı başlatma, kullanıcılardan nasıl dosya alınacağına ve dosyalara nasıl erişileceğini gösterir. Dosyayı alın request.files
ve özet işlevine iletin.
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'
Anahtarını request.files
HTML formunuzdaki dosya girişinin adıyla değiştirin .
Bir JSON yanıtı döndürmek ve bir durum kodu ayarlamak için aşağıdakileri kullanabilirsiniz make_response
:
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return make_response(jsonify(d), 200)
Flask sorunu izleyicisindeki bu yorumdan ilham alındı .
Sürüm 1.1.0 Flask'tan itibaren, bir görünüm bir dikte döndürürse, JSON yanıtına dönüştürülür .
@app.route("/users", methods=['GET'])
def get_user():
return {
"user": "John Doe",
}
Sonucu döndürmek için bir dekoratör kullanıyorum jsonfiy
. Bir görünümün birden fazla dönüşü olduğunda daha okunabilir olduğunu düşünüyorum. Bu gibi bir tuple döndürmeyi desteklemiyor content, status
, ancak app.errorhandler
bunun yerine dönen hata durumlarını ele alıyorum .
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'den önce, jsonfiy
bir dizinin doğrudan döndürülmesine izin vermezdi. Bunun yerine, listeyi anahtar kelime bağımsız değişkeni olarak iletin.
@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'de, bir sözlük döndürürseniz ve otomatik olarak JSON'a dönüştürülürse. Yani make_summary()
bir sözlük döndürürse,
from flask import Flask
app = Flask(__name__)
@app.route('/summary')
def summary():
d = make_summary()
return d
Durum kodu dahil sorar SO buna kopyası olarak kapatıldı. Bu soruyu da yanıtlamak için formun bir demetini döndürerek durum kodunu ekleyebilirsiniz (dict, int)
. Bu dict
, JSON'a dönüştürülür ve int
HTTP Durum Kodu olur. Herhangi bir girdi olmadan, Durum varsayılan 200'dür. Dolayısıyla yukarıdaki örnekte kod 200 olacaktır. Aşağıdaki örnekte 201 olarak değiştirilmiştir.
from flask import Flask
app = Flask(__name__)
@app.route('/summary')
def summary():
d = make_summary()
return d, 201 # 200 is the default
Durum kodunu kullanarak
curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
eğer bu bir dikte ise, şişe doğrudan iade edebilir (Sürüm 1.0.2)
def summary():
d = make_summary()
return d, 200
"" " Flask Sınıf Taban Görünümünü Kullanma " ""
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)
Şişesi 1.1.x
şimdi Flask destek isteği doğrudan json ile iade, jsonify artık gerekli değil
@app.route("/")
def index():
return {
"api_stuff": "values",
}
eşittir
@app.route("/")
def index():
return jsonify({
"api_stuff": "values",
})
daha fazla bilgi için burayı okuyun https://medium.com/octopus-wealth/returning-json-from-flask-cf4ce6fe9aeb ve https://github.com/pallets/flask/pull/3111