it-swarm.asia

كيفية الحصول على وظيفة json في قارورة؟

أحاول إنشاء واجهة برمجة تطبيقات بسيطة باستخدام Flask ، والتي أريد الآن أن أقرأ بعض POSTed JSON. أقوم بالنشر باستخدام PostMan Chrome extension و JSON I post is {"text":"lalala"} ببساطة. أحاول قراءة JSON باستخدام الطريقة التالية:

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

على المستعرض ، يقوم بإرجاع uuid الذي أضعه في GET بشكل صحيح ، ولكن على وحدة التحكم ، يطبع فقط None (حيث أتوقع أن يطبع رمز {"text":"lalala"}. هل يعرف أحد كيف يمكنني الحصول على JSON المنشورة من داخل طريقة Flask ؟

238
kramer65

بادئ ذي بدء ، تم إهمال سمة .json ، يجب عليك استخدام request.get_json() .

تحتاج إلى تعيين نوع محتوى الطلب على application/json لخاصية .json وطريقة .get_json() للعمل ؛ إما إنتاج None خلاف ذلك. راجع قارورة Request الوثائق :

سيحتوي هذا على بيانات JSON التي تم تحليلها إذا كان النوع Mimetype يشير إلى JSON ( application/json ، راجع is_json() ) ، وإلا فسيكون None.

يمكنك إخبار request.get_json() بتخطي متطلبات نوع المحتوى عن طريق ضبط force=True.

لاحظ أنه إذا تم رفع استثناء في هذه المرحلة (مما قد ينتج عنه استجابة 400 طلب غير صحيح) ، فإن JSON data غير صالح. إنه مشوه بطريقة ما. قد ترغب في التحقق من ذلك باستخدام أداة التحقق JSON.

325
Martijn Pieters

كمرجع ، إليك رمز كامل لكيفية إرسال json من عميل Python:

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

سوف يقوم الإدخال "json =" بتعيين نوع المحتوى تلقائيًا ، كما تمت مناقشته هنا: نشر JSON باستخدام طلبات Python

وسيعمل العميل أعلاه مع هذا الكود من جانب الخادم:

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 __== '__main__':
    app.run(Host= '0.0.0.0',debug=True)
61
Luke

هذه هي الطريقة التي سأفعلها ويجب أن تكون كذلك

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

إعداد force=True سيتجاهل request.headers.get('Content-Type') == 'application/json' check تحقق من أن القارورة تفعل لك. بشكل افتراضي ، يتم ضبط هذا أيضًا على False.

انظر وثائق قارورة .

أوصي بشدة ترك force=False وجعل العميل يرسل رأس Content-Type لجعله أكثر وضوحًا.

أتمنى أن يساعدك هذا!

54
radtek

هذا الحل يعمل:

from flask import Flask, request, jsonify

app = Flask(__name__)


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

يمكننا استخدام المعلمات لحل بيانات json

import flask
from flask import request, jsonify
import Parameters

application = flask.Flask(__name__)

@application.route('/myappp', methods=['POST'])
    @cross_Origin('*')
    def User_details_by_mailID():
        payload = request.get_json()
        email = payload[Parameters.email]
        return jsonify(email)
0
Aakash Handa