फ्लास्क दृश्य से JSON प्रतिक्रिया लौटाएं


464

मेरे पास एक फ़ंक्शन है जो पंडों के साथ एक सीएसवी फ़ाइल का विश्लेषण करता है और सारांश जानकारी के साथ एक तानाशाही पैदा करता है। मैं एक फ्लास्क दृश्य से प्रतिक्रिया के रूप में परिणाम वापस करना चाहता हूं। मैं JSON प्रतिक्रिया कैसे लौटाऊं?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json

जवाबों:


752

jsonifyफ़ंक्शन का सारांश डेटा पास करें , जो JSON प्रतिक्रिया देता है।

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)

फ्लास्क 0.11 के रूप में, आप शीर्ष स्तर के ऑब्जेक्ट के रूप में किसी भी JSON-serializable प्रकार को पारित कर सकते हैं, न कि केवल तानाशाही।


4
फ्लास्क 1.1.0 के रूप में , अब आप सीधे एक अजगर को वापस भेज सकते हैं, और यह फ्लास्क द्वारा स्वचालित रूप से jsonify'd होगा।
बॉल

203

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

128

कीवर्ड तर्क पास करें 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)


के अनुसार 1.1.0 रिलीज नोट्स, बोतल के लिए एक दृश्य समारोह से एक शब्दकोश लौटने की अनुमति देता है। कैसे एक स्ट्रिंग लौटने के समान एक पाठ / एचटीएमएल प्रतिक्रिया का उत्पादन करेगा, एक तानाशाह को लौटाने को एक आवेदन /
जसन

34

यदि आप jsonifyकिसी कारण से उपयोग नहीं करना चाहते हैं , तो आप वह कर सकते हैं जो वह स्वयं करता है। flask.json.dumpsJSON डेटा बनाने के लिए कॉल करें, फिर 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उपलब्ध होने पर तेज मॉड्यूल का उपयोग करेगा , और आपके फ्लास्क ऐप के साथ विभिन्न एकीकरण को सक्षम करता है।


17

यदि आप उपयोगकर्ता द्वारा अपलोड की गई फ़ाइल का विश्लेषण करना चाहते हैं, तो फ्लास्क क्विकस्टार्ट दिखाता है कि उपयोगकर्ताओं से फाइलें कैसे प्राप्त करें और उन्हें एक्सेस कैसे करें। फ़ाइल प्राप्त करें 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')

अपने HTML फॉर्म में फ़ाइल इनपुट के नाम के साथ 'data'कुंजी को बदलें request.files


13

JSON प्रतिक्रिया वापस करने और एक स्थिति कोड सेट करने के लिए जिसका आप उपयोग कर सकते हैं make_response:

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)

फ्लास्क इश्यू ट्रैकर में इस टिप्पणी से ली गई प्रेरणा ।



10

के परिणाम को वापस करने के लिए मैं एक डेकोरेटर का उपयोग करता हूं 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'

4

फ्लास्क 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)

2

फ्लास्क 1.1 में, यदि आप एक शब्दकोश लौटाते हैं और यह स्वचालित रूप से JSON में परिवर्तित हो जाएगा। इसलिए यदि make_summary()कोई शब्दकोश देता है, तो आप कर सकते हैं

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d

ताकि स्थिति कोड सहित के बारे में पूछता है यह एक करने के लिए डुप्लीकेट के रूप में बंद हो गया। तो उस प्रश्न का उत्तर देने के लिए, आप प्रपत्र का एक टपल लौटाकर स्थिति कोड शामिल कर सकते हैं (dict, int)dictJSON में बदल जाती है और intHTTP स्थिति कोड होगा। किसी भी इनपुट के बिना, स्थिति 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"

0

यदि इसकी एक तानाशाही है, तो फ्लास्क इसे सीधे लौटा सकता है (संस्करण 1.0.2)

def summary():
    d = make_summary()
    return d, 200

0

"" फ्लास्क क्लास-बेस व्यू का उपयोग ""

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)

0

फ्लास्क 1.1.x

अब फ्लास्क सपोर्ट रिक्वेस्ट रिटर्न विद जोंस , जोंसीफाई अब और नहीं चाहिए

@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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.