ฉันสร้างมิดเดิลแวร์ WSGI ที่เก็บเนื้อหาดิบจากenviron['wsgi.input']
สตรีม ฉันบันทึกค่าในสภาพแวดล้อม WSGI ดังนั้นฉันจึงสามารถเข้าถึงได้จากrequest.environ['body_copy']
ภายในแอปของฉัน
สิ่งนี้ไม่จำเป็นใน Werkzeug หรือ Flask เนื่องจาก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
environ['wsgi.input'] = BytesIO(body)
return self.application(environ, start_response)
app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']