Zuvor habe ich gefragt, wie Daten in der Flask-Anfrage empfangen werden sollen, da sie request.data
leer sind. In der Antwort wurde erklärt, dass dies request.data
der rohe Post-Body ist, aber leer ist, wenn Formulardaten analysiert werden. Wie kann ich den rohen Postkörper bedingungslos bekommen?
@app.route('/', methods=['POST'])
def parse_request():
data = request.data # empty in some cases
# always need raw data here, not parsed form data
request.stream
ist der Strom von Rohdaten, der vom WSGI-Server an die Anwendung übergeben wird. Beim Lesen wird keine Analyse durchgeführt, obwohl Sie dies normalerweise möchtenrequest.get_data()
.Der Stream ist leer, wenn er zuvor von
request.data
einem anderen Attribut gelesen wurde .quelle
Ich habe eine WSGI-Middleware erstellt, die den Rohkörper aus dem
environ['wsgi.input']
Stream speichert . Ich habe den Wert in der WSGI-Umgebung gespeichert, damit ich überrequest.environ['body_copy']
meine App darauf zugreifen kann .Dies ist in Werkzeug oder Flask nicht erforderlich, da
request.get_data()
die Rohdaten unabhängig vom Inhaltstyp abgerufen werden, jedoch mit einer besseren Handhabung des HTTP- und WSGI-Verhaltens.Dadurch wird der gesamte Körper in den Speicher eingelesen. Dies ist ein Problem, wenn beispielsweise eine große Datei veröffentlicht wird. Dies liest nichts, wenn der
Content-Length
Header fehlt, sodass Streaming-Anforderungen nicht verarbeitet werden.quelle
request.data
wird leer sein, wennrequest.headers["Content-Type"]
es als Formulardaten erkannt wird, in die analysiert wirdrequest.form
. Verwenden Sie, um die Rohdaten unabhängig vom Inhaltstyp abzurufenrequest.get_data()
.request.data
Aufruferequest.get_data(parse_form_data=True)
, was zu einem unterschiedlichen Verhalten der Formulardaten führt.quelle