फ्लास्क अनुरोध में प्राप्त डेटा प्राप्त करें


735

मैं अपने फ्लास्क ऐप को भेजे गए डेटा को प्राप्त करने में सक्षम होना चाहता हूं। मैंने एक्सेस करने की कोशिश की है request.dataलेकिन यह एक खाली स्ट्रिंग है। आप अनुरोध डेटा का उपयोग कैसे करते हैं?

from flask import request

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here

इस प्रश्न के उत्तर से मुझे पाइथन फ्लास्क में कच्चे POST निकाय से पूछने के लिए प्रेरित किया गया , जो कि आगे कंटेंट-टाइप हेडर की परवाह किए बिना है , जो कि पार्स किए गए डेटा के बजाय कच्चा डेटा प्राप्त करने के बारे में है।

जवाबों:


1264

डॉक्स विशेषताओं के अनुरोध पर उपलब्ध वर्णन करते हैं। अधिकांश सामान्य मामलों में request.dataखाली हो जाएगा क्योंकि यह एक कमबैक के रूप में उपयोग किया जाता है:

request.data इसमें आने वाली रिक्वेस्ट डेटा को स्ट्रिंग के रूप में शामिल किया गया है, जब यह mimetype के साथ आया था फ्लास्क हैंडल नहीं करता है।

  • request.args: URL क्वेरी स्ट्रिंग में कुंजी / मान जोड़े
  • request.form: HTML पोस्ट फॉर्म, या जावास्क्रिप्ट अनुरोध जो JSON एनकोडेड नहीं है, शरीर में प्रमुख / मूल्य जोड़े
  • request.files: शरीर में फाइलें, जो फ्लास्क से अलग रहती हैं form। HTML प्रपत्रों का उपयोग करना चाहिए enctype=multipart/form-dataया फ़ाइलों को अपलोड नहीं किया जाएगा।
  • request.values: यदि कुंजियाँ ओवरलैप होती हैं , तो संयुक्त argsऔर अधिमान्यformargs
  • request.json: JSON डेटा पार्स। अनुरोध में application/jsonसामग्री प्रकार होना चाहिए , या सामग्री प्रकार request.get_json(force=True)को अनदेखा करने के लिए उपयोग करना चाहिए ।

ये सभी MultiDictउदाहरण हैं (को छोड़कर json)। आप का उपयोग कर मूल्यों का उपयोग कर सकते हैं:

  • request.form['name']: यदि आप जानते हैं कि कुंजी मौजूद है, तो अनुक्रमणिका का उपयोग करें
  • request.form.get('name'): getकुंजी मौजूद नहीं होने पर उपयोग करें
  • request.form.getlist('name'): getlistयदि कुंजी कई बार भेजी जाती है और आप मानों की सूची चाहते हैं, तो उसका उपयोग करें । getकेवल पहला मान लौटाता है।

204

कच्चा डेटा प्राप्त करने के लिए, का उपयोग करें request.data। यह केवल तभी काम करता है जब इसे फॉर्म डेटा के रूप में पार्स नहीं किया जा सकता है, अन्यथा यह खाली हो जाएगा और request.formइसमें पार्स डेटा होगा।

from flask import request
request.data

177

URL क्वेरी पैरामीटर के लिए, उपयोग करें request.args

search = request.args.get("search")
page = request.args.get("page")

पोस्ट किए गए फॉर्म इनपुट के लिए, उपयोग करें request.form

email = request.form.get('email')
password = request.form.get('password')

JSON के लिए सामग्री प्रकार के साथ पोस्ट किया गया application/json, उपयोग करें request.get_json()

data = request.get_json()

98

यहाँ JSON डेटा पोस्ट करने और इसे वापस गूँजने का एक उदाहरण है।

from flask import Flask, request, jsonify

app = Flask(__name__)

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

JSON को कर्ल के साथ पोस्ट करने के लिए:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo

या पोस्टमैन का उपयोग करने के लिए:

JSON पोस्ट करने के लिए पोस्टमैन का उपयोग करना


36

यदि आप JSON को सामग्री प्रकार के साथ पोस्ट application/jsonकरते हैं, तो request.get_json()इसे फ्लास्क में प्राप्त करने के लिए उपयोग करें। यदि सामग्री प्रकार सही नहीं है, Noneतो वापस कर दिया जाता है। यदि डेटा JSON नहीं है, तो एक त्रुटि उठाई गई है।

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()

31

सामग्री प्रकार की परवाह किए बिना कच्ची पोस्ट बॉडी पाने के लिए, उपयोग करें request.get_data()। यदि आप उपयोग करते हैं request.data, तो यह कॉल करता है request.get_data(parse_form_data=True), जो पॉप्युलेट करेगा request.form MultiDictऔर dataखाली छोड़ देगा ।


18

request.formएक सामान्य शब्दकोश के रूप में प्राप्त करने के लिए , का उपयोग करें request.form.to_dict(flat=False)

एपीआई के लिए JSON डेटा वापस करने के लिए, इसे पास करें jsonify

यह उदाहरण JSON डेटा के रूप में डेटा लौटाता है।

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

यहाँ कर्ल के साथ POST फॉर्म डेटा का एक उदाहरण है, JSON के रूप में लौटाया गया:

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

12

request.get_json()पोस्ट किए गए JSON डेटा प्राप्त करने के लिए उपयोग करें ।

data = request.get_json()
name = data.get('name', '')

request.formPOST विधि के साथ फॉर्म जमा करते समय डेटा प्राप्त करने के लिए उपयोग करें ।

name = request.form.get('name', '')

request.argsURL की क्वेरी स्ट्रिंग में डेटा प्राप्त करने के लिए उपयोग करें , जैसे कि GET विधि के साथ फ़ॉर्म सबमिट करते समय।

request.args.get("name", "")

request.formआदि हुकुम की तरह हैं, getयदि यह पारित नहीं हुआ था, तो डिफ़ॉल्ट रूप से मान प्राप्त करने के लिए विधि का उपयोग करें ।


10

JSON को application/jsonसामग्री प्रकार के बिना पोस्ट करने के लिए , उपयोग करें request.get_json(force=True)

@app.route('/process_data', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True)
    language = req_data['language']
    return 'The language value is: {}'.format(language)

10

कच्चे डेटा को WSGI सर्वर से फ्लास्क एप्लिकेशन के रूप में पास किया जाता है request.stream। स्ट्रीम की लंबाई Content-Lengthहेडर में है।

length = request.headers["Content-Length"]
data = request.stream.read(length)

यह आमतौर पर उपयोग करने के लिए सुरक्षित है request.get_data()


9

जावास्क्रिप्ट में jQuery के साथ JSON पोस्ट करने के लिए, JSON.stringifyडेटा को डंप करने के लिए उपयोग करें, और सामग्री प्रकार को सेट करें application/json

var value_data = [1, 2, 3, 4];

$.ajax({
    type: 'POST',
    url: '/process',
    data: JSON.stringify(value_data),
    contentType: 'application/json',
    success: function (response_data) {
        alert("success");
    }   
});

इसे फ्लास्क में पार्स करें request.get_json()

data = request.get_json()

8

JSON को पार्स करने के लिए, का उपयोग करें request.get_json()

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)

5

उपयोगकर्ता को डेटाबेस में जोड़ने के लिए फ़ॉर्म डेटा पोस्ट करने का एक उदाहरण यहां दिया गया है। चेक request.method == "POST"अगर प्रपत्र प्रस्तुत की गई थी की जाँच करने के। से कुंजियों का उपयोग करेंrequest.formप्रपत्र डेटा प्राप्त करने के लिए । <form>अन्यथा के साथ एक HTML टेम्पलेट रेंडर करें । प्रपत्र में फ़ील्ड में ऐसी nameविशेषताएँ होनी चाहिए जो कुंजियों से मेल खाती हों request.form

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/user/add", methods=["GET", "POST"])
def add_user():
    if request.method == "POST":
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("index"))

    return render_template("add_user.html")
<form method="post">
    <label for="username">Username</label>
    <input type="text" name="username" id="username">
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <input type="submit">
</form>

4

यदि सामग्री प्रकार को प्रपत्र डेटा के रूप में पहचाना जाता है, तो request.dataवह इसे पार्स कर देगाrequest.form और खाली स्ट्रिंग लौटाएगा।

सामग्री प्रकार की परवाह किए बिना कच्चा डेटा प्राप्त करने के लिए, कॉल करें request.get_data()request.dataकॉल get_data(parse_form_data=True), जबकि डिफ़ॉल्ट Falseअगर आप इसे सीधे कॉल करते हैं।


4

यदि शरीर को प्रपत्र डेटा के रूप में मान्यता प्राप्त है, तो यह अंदर होगा request.form। यदि यह JSON है, तो यह अंदर होगा request.get_json()। अन्यथा कच्चे डेटा में होगा request.data। यदि आप सुनिश्चित नहीं हैं कि डेटा कैसे सबमिट किया जाएगा, तो आप orडेटा के साथ पहला प्राप्त करने के लिए एक श्रृंखला का उपयोग कर सकते हैं ।

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.argsइसमें क्वेरी स्ट्रिंग से पार्स किए गए आर्गन्स शामिल हैं, भले ही शरीर में कोई भी हो, इसलिए आप इसे हटा देंगे get_request_data()यदि यह और शरीर दोनों एक ही समय में डेटा होना चाहिए।


2

HTML फॉर्म के साथ फ़ॉर्म डेटा पोस्ट करते समय, सुनिश्चित करें कि inputटैग में nameविशेषताएँ हैं, अन्यथा वे मौजूद नहीं होंगे request.form

@app.route('/', methods=['GET', 'POST'])
def index():
    print(request.form)
    return """
<form method="post">
    <input type="text">
    <input type="text" id="txt2">
    <input type="text" name="txt3" id="txt3">  
    <input type="submit">
</form>
"""
ImmutableMultiDict([('txt3', 'text 3')])

केवल txt3इनपुट में एक था name, इसलिए यह एकमात्र कुंजी है जिसमें मौजूद है request.form

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