सामग्री-प्रकार के हेडर की परवाह किए बिना पायथन फ्लास्क में कच्चे POST बॉडी प्राप्त करें


131

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

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data

जवाबों:


218

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

यदि आप request.dataपहले एक्सेस करते हैं , तो यह get_dataफॉर्म डेटा को पार्स करने के लिए एक तर्क के साथ कॉल करेगा । अनुरोध को फ़ॉर्म सामग्री प्रकार है ( multipart/form-data, application/x-www-form-urlencoded, या application/x-url-encoded) तो कच्चे डेटा भस्म हो जाएगा। request.dataऔर request.jsonइस मामले में खाली दिखाई देगा।



34

request.streamडब्लूएसजीआई सर्वर द्वारा आवेदन करने के लिए पारित कच्चे डेटा की धारा है। इसे पढ़ते समय कोई पार्स नहीं किया जाता है, हालांकि आप आमतौर पर request.get_data()इसके बजाय चाहते हैं।

data = request.stream.read()

यदि यह पहले request.dataया किसी अन्य विशेषता द्वारा पढ़ा गया था, तो स्ट्रीम खाली हो जाएगी ।


15

मैंने एक WSGI मिडलवेयर बनाया जो environ['wsgi.input']स्ट्रीम से कच्चे शरीर को स्टोर करता है। मैंने डब्लूएसजीआई के इनसाइट्स में मूल्य को बचाया ताकि मैं इसे एक्सेस कर सकूंrequest.environ['body_copy'] अपने ऐप के भीतर ।

Werkzeug या फ्लास्क में, यह आवश्यक नहीं है request.get_data() सामग्री प्रकार की परवाह किए बिना कच्चा डेटा मिलेगा, लेकिन HTTP और WSGI व्यवहार के बेहतर संचालन के साथ।

यह पूरे शरीर को मेमोरी में पढ़ता है, जो कि एक मुद्दा होगा यदि उदाहरण के लिए एक बड़ी फ़ाइल पोस्ट की जाती है। यदि Content-Lengthहेडर गायब है, तो यह कुछ भी नहीं पढ़ेगा , इसलिए यह स्ट्रीमिंग अनुरोधों को संभाल नहीं पाएगा।

from io import BytesIO

class WSGICopyBody(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        length = int(environ.get('CONTENT_LENGTH') or 0)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        # replace the stream since it was exhausted by read()
        environ['wsgi.input'] = BytesIO(body)
        return self.application(environ, start_response)

app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']

6

request.datarequest.headers["Content-Type"]फॉर्म डेटा के रूप में पहचाने जाने पर रिक्त हो जाएगा , जिसे पार्स किया जाएगा request.form। सामग्री प्रकार की परवाह किए बिना कच्चे डेटा का उपयोग करने के लिए request.get_data()

request.dataकॉल request.get_data(parse_form_data=True), जिसके परिणामस्वरूप फॉर्म डेटा के लिए अलग व्यवहार होता है।

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