ফ্লাস্ক ভিউ থেকে জেএসএন প্রতিক্রিয়া ফিরুন


464

আমার একটি ফাংশন রয়েছে যা পান্ডাদের সাথে একটি সিএসভি ফাইল বিশ্লেষণ করে এবং সংক্ষিপ্ত তথ্যের সাথে ডিক উত্পাদন করে। আমি ফ্লাস্ক ভিউ থেকে প্রতিক্রিয়া হিসাবে ফলাফলগুলি ফিরিয়ে দিতে চাই। আমি কীভাবে কোনও জেএসএন প্রতিক্রিয়া ফিরিয়ে দেব?

@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)

ফ্লাস্ক ০.০১ হিসাবে, আপনি শীর্ষ স্তরের অবজেক্ট হিসাবে কেবল ডিককেই নয়, কোনও জেএসএন-সিরিয়ালাইজযোগ্য প্রকারটি পাস করতে পারেন।


3
ফ্লাস্কের ১.১.০ হিসাবে , আপনি এখন সরাসরি একটি অজগর ডিকটি ফিরিয়ে দিতে পারবেন এবং এটি ফ্লেস্ক দ্বারা স্বয়ংক্রিয়ভাবে জসনফাই হয়ে যাবে।
অ্যাড্রিয়েন বল

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')

আপনার এইচটিএমএল ফর্মের ফাইল ইনপুটটির নামটির '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

ফ্লাস্ক ১.১ এ, আপনি যদি কোনও অভিধান ফেরত দেন এবং এটি স্বয়ংক্রিয়ভাবে জেএসএনে রূপান্তরিত হয়। সুতরাং যদি make_summary()একটি অভিধান প্রদান করে, আপনি পারেন

from flask import Flask

app = Flask(__name__)

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

সুতরাং যে অবস্থা কোড সহ সম্পর্কে জিজ্ঞেস করে এই এক সদৃশ হিসাবে বন্ধ ছিল। সুতরাং এই প্রশ্নের উত্তর দেওয়ার জন্য, আপনি ফর্মের একটি টিপল ফিরিয়ে স্ট্যাটাস কোডটি অন্তর্ভুক্ত করতে পারেন (dict, int)dictতাদেরকে JSON রূপান্তরিত হয় এবং intHTTP স্থিতি কোড থাকবে। কোনও ইনপুট ছাড়াই, স্ট্যাটাসটি ডিফল্ট 200 So তাই উপরের উদাহরণে কোডটি 200 হবে below নীচের উদাহরণে এটি 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/pallet/flask/pull/3111 পড়ুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.