मैंने एक 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']