ফ্লাস্কে পোষ্টড জেএসএন কীভাবে পাবেন?


326

আমি ফ্লাস্ক ব্যবহার করে একটি সাধারণ API তৈরির চেষ্টা করছি, যেখানে আমি এখন কিছু পোস্টেড জেএসওএন পড়তে চাই। আমি পোস্টম্যান ক্রোম এক্সটেনশন দিয়ে পোষ্টটি করি এবং জেএসএন আই পোস্টটি সহজভাবে {"text":"lalala"}। আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করে জেএসএন পড়ার চেষ্টা করি:

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content
    return uuid

ব্রাউজারে এটি সঠিকভাবে আমি জিইটি-তে রাখা ইউআইডিটি ফিরিয়ে দেয় তবে কনসোলে এটি কেবল প্রিন্ট করে None(যেখানে আমি এটি প্রিন্ট করার আশা করি {"text":"lalala"}any ফ্লেস্ক পদ্ধতিতে পোস্ট জেএসএনকে কীভাবে পেতে পারি তা কি কেউ জানেন?

উত্তর:


427

প্রথমত, .jsonবৈশিষ্ট্যটি এমন একটি সম্পত্তি যা request.get_json()পদ্ধতিতে প্রতিনিধিত্ব করে , আপনি Noneএখানে কেন দলিল করেন documents

সম্পত্তি এবং পদ্ধতি (কোনও যুক্তি ছাড়াই) অন্যথায় উত্পাদন করতে হবে হিসাবে কাজ করার application/jsonজন্য আপনাকে অনুরোধ সামগ্রীর ধরণের সেট করতে হবে । দেখুন বোতল ডকুমেন্টেশন :.json.get_json()NoneRequest

এতে পার্সযুক্ত জেএসওন ডেটা থাকবে যদি মাইমটাইপ জেএসএনকে নির্দেশ করে ( অ্যাপ্লিকেশন / জেসসন , দেখুন is_json()), অন্যথায় এটি হবে None

আপনি কীওয়ার্ড আর্গুমেন্টটি request.get_json()পাস করে কনটেন্ট টাইপের প্রয়োজনীয়তা এড়িয়ে যেতে বলতে পারেন force=True

মনে রাখবেন যে যদি এই মুহূর্তে কোনও ব্যতিক্রম উত্থাপিত হয় (সম্ভবত 400 টির অনুরোধের প্রতিক্রিয়ার ফলে) আপনার জেএসওএন ডেটা অবৈধ। এটি একরকমভাবে বিকৃত; আপনি এটি JSON যাচাইকারীর মাধ্যমে পরীক্ষা করতে চাইতে পারেন।


আমি ভেবেছিলাম যখন এই সময়ে কোনও ব্যতিক্রম উত্থাপিত হয় তখন এটির সম্ভাব্যতা 500 টি অভ্যন্তরীণ ত্রুটির প্রতিক্রিয়া হিসাবে দেখা উচিত, তাই না?
আইবুগ

100

রেফারেন্সের জন্য, পাইথন ক্লায়েন্টের থেকে জসন কীভাবে প্রেরণ করা যায় তার জন্য এখানে সম্পূর্ণ কোড:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print res.json()

"Json =" ইনপুটটি স্বয়ংক্রিয়ভাবে বিষয়বস্তুর ধরণ সেট করবে, যেমন এখানে আলোচনা করা হয়েছে: পাইথন অনুরোধগুলি ব্যবহার করে জেএসএন পোস্ট করুন

এবং উপরের ক্লায়েন্টটি এই সার্ভার-সাইড কোড সহ কাজ করবে:

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['mytext']
    return jsonify({"uuid":uuid})

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

71

এইভাবেই আমি এটি করব এবং এটি হওয়া উচিত

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Do your processing
    return uuid

সঙ্গে silent=Trueসেট, get_jsonফাংশন চুপটি যখন JSON শরীর পুনরুদ্ধার করতে চেষ্টা ব্যর্থ হবে। ডিফল্টরূপে এটি সেট করা আছে False। যদি আপনি সর্বদা জসন বডি (অপশনালি নয়) এর প্রত্যাশা করে থাকেন তবে এটিকে ছেড়ে দিন silent=False

ফ্লেস্ক আপনার জন্য যা force=Trueযা request.headers.get('Content-Type') == 'application/json'পরীক্ষা করে তা সেট করা সেটাকে অগ্রাহ্য করবে । ডিফল্টরূপে এটিতেও সেট করা আছে False

ফ্লাস্ক ডকুমেন্টেশন দেখুন ।

আমি দৃ leaving়ভাবে চলে যাওয়ার সুপারিশ করব force=Falseএবং ক্লায়েন্টটিকে Content-Typeআরও স্পষ্ট করতে হেডারটি প্রেরণ করব ।

আশাকরি এটা সাহায্য করবে!


2
নির্ভর করে যদি
জসন বডিটি alচ্ছিক

2
আমি এমন কোনও ক্ষেত্রে দেখতে পাচ্ছি না যেখানে বৈধ জেসন এবং অন্যান্য সময় অবৈধ জসনকে পোস্ট করার সময় এটি বোঝা যায়। দুটি ভিন্ন শেষ পয়েন্ট মত শোনাচ্ছে
vidstige

1
যেমনটি আমি বলেছিলাম, যদি কোনও শেষ পয়েন্টটি "alচ্ছিক" জেসন বডি নেয়, আপনি ব্যবহার করতে পারেন silent=True। হ্যাঁ এটি সম্ভব, এবং আমি এটি ব্যবহার করি। এটি কীভাবে আপনি আপনার এপিআই গ্রাস করতে ডিজাইন করেন তার উপর ভিত্তি করে। আপনার শেষ পয়েন্টের জন্য যদি এর মতো কোনও মামলা না থাকে তবে কেবল সরিয়ে দিন silent=Trueবা স্পষ্টভাবে সেট করুন False
Radtek

স্পষ্টতার জন্য, print(content)পরে content = request.get_json()বস্তুটি মুদ্রণ করে ... তবে একটি বৈধ পাইথন অবজেক্ট হিসাবে (এবং কোনও বৈধ জেএসএন বস্তু হিসাবে নয়)। উদাহরণস্বরূপ, এটি একক উদ্ধৃতি ব্যবহার করে যখন JSON- এ স্ট্রিংয়ের মান হিসাবে দুটি মূল মান (স্ট্রিং) এর জন্য কঠোরভাবে ডাবল উদ্ধৃতি প্রয়োজন। আপনি যদি JSON উপস্থাপনা চান json.dumps()তবে অবজেক্টটি ব্যবহার করুন।
জোচেম শুলেনক্লাপ্পার 12:58

24

ধরে নিচ্ছেন আপনি এর সাথে বৈধ জেএসএন পোস্ট করেছেন application/json সামগ্রীর প্রকারের , request.jsonএতে পার্স করা JSON ডেটা থাকবে।

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/echo', methods=['POST'])
def hello():
   return jsonify(request.json)

3
এই উত্তরে যুক্ত করতে আপনি এই শেষ পয়েন্টে যে অনুরোধটি পাঠাতে পারেন তা হতে পারে response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"})। এই দৌড় অনুসরণ করে response.json()ফিরে {'foo': 'bar'}
আসা

এটি লক্ষণীয় যে {'foo': 'bar'}এটি বৈধ JSON নয়। এটি বৈধ পাইথন অবজেক্টের উপস্থাপনা হতে পারে যা দেখতে অনেকটা JSON এর মতো লাগে তবে বৈধ JSON কঠোরভাবে ডাবল উদ্ধৃতি ব্যবহার করে।
জোহেম শুলেনক্লাপ্পার

@ জোখেমস্কুলেনক্লাপ্পার থেকে অনুরোধের get_json()পদ্ধতিটি ডিকোড হয়েছে তাদেরকে JSON পাইথন বস্তু, হ্যাঁ। আপনি কোথায় এটি বৈধ JSON নথি তৈরি করার প্রত্যাশা করছেন?
মার্টিজন পিটারস

@ মার্তিজ্নপিটারস, আমি কেবল একটি বিশেষত্ব সম্পর্কে একটি বিবৃতি দিচ্ছিলাম যা আমাকে কমপক্ষে দ্বিগুণ করেছে :-) তবে হ্যাঁ, সাধারণত আমি পাইথন ডিক্স নয়, একটি কার্যকর জেএসএন অবজেক্ট উপস্থাপনা প্রত্যাবর্তন করি .json()বা .get_json()প্রত্যাবর্তন করি। আমি কেবল নামটি দেখছি এবং এটি থেকে কী বেরিয়ে আসতে পারে তা নির্ধারণ করছি।
জোহেম শুলেনক্লাপ্পার

5

যাদের ইস্যুটি আজাক্স কল থেকেই ছিল তাদের সকলের জন্য এখানে একটি সম্পূর্ণ উদাহরণ রয়েছে:

আজাক্স কল: এখানে কীটি হ'ল এক dictএবং তারপরে ব্যবহার করাJSON.stringify

    var dict = {username : "username" , password:"password"};

    $.ajax({
        type: "POST", 
        url: "http://127.0.0.1:5000/", //localhost Flask
        data : JSON.stringify(dict),
        contentType: "application/json",
    });

এবং সার্ভার দিকে:

from flask import Flask
from flask import request
import json

app = Flask(__name__)

@app.route("/",  methods = ['POST'])
def hello():
    print(request.get_json())
    return json.dumps({'success':True}), 200, {'ContentType':'application/json'} 

if __name__ == "__main__":
    app.run()

1
এই জিনিসটি আমার পক্ষে কাজ করেছে, অনেক ধন্যবাদ! :)
vjjj

1

অন্য একটি পদ্ধতির দিতে।

from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/service', methods=['POST'])
def service():
    data = json.loads(request.data)
    text = data.get("text",None)
    if text is None:
        return jsonify({"message":"text not found"})
    else:
        return jsonify(data)

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

0

ধরে নিই যে আপনি বৈধ JSON পোস্ট করেছেন,

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content['uuid']
    # Return data as JSON
    return jsonify(content)

0

ফোর্স প্যারামিটার ব্যবহার করার চেষ্টা করুন ...

request.get_json(force = True)

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