Wie behandeln "413: Request Entity Too Large" in python-flask-server
Ich bin mit Kolben-uploads zum upload von Dateien auf meine Flask-server. Die max erlaubte Größe ist festgelegt durch die Verwendung flaskext.uploads.patch_request_class(app, 16 * 1024 * 1024)
.
Meine client-Anwendung (unit-test) verwendet Anfragen post eine Datei, die ist zu groß.
Kann ich sehen, dass mein server returnes HTTP-Antwort mit dem status 413: Request Entity Too Large
. Aber der client löst eine Ausnahme in der Anfragen code
ConnectionError: HTTPConnectionPool(host='api.example.se', port=80): Max retries exceeded with url: /images (Caused by <class 'socket.error'>: [Errno 32] Broken pipe)
Meine Vermutung ist, dass der server die Verbindung trennen den Empfang von socket und sendet die Antwort zurück an den client. Aber wenn der client bekommt eine gebrochene senden socket, wirft Sie eine Ausnahme aus und überspringt die Antwort.
Fragen:
- Meine Vermutung über Kolben-Uploads und-Anfragen korrekt?
- Tut Kolben-Uploads und verlangen Griff der 413 Fehler korrigieren?
- Sollte ich erwarten, dass mein client-code wird wieder etwas html-Code, wenn die post sind zu groß?
Update
Hier ist ein einfaches Beispiel zu reproduzieren mein problem.
server.py
from flask import Flask, request
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 1024
@app.route('/post', methods=('POST',))
def view_post():
return request.data
app.run(debug=True)
client.py
from tempfile import NamedTemporaryFile
import requests
def post(size):
print "Post with size %s" % size,
f = NamedTemporaryFile(delete=False, suffix=".jpg")
for i in range(0, size):
f.write("CoDe")
f.close()
# Post
files = {'file': ("tempfile.jpg", open(f.name, 'rb'))}
r = requests.post("http://127.0.0.1:5000/post", files=files)
print "gives status code = %s" % r.status_code
post(16)
post(40845)
post(40846)
Ergebnis von client
Post with size 16 gives status code = 200
Post with size 40845 gives status code = 413
Post with size 40846
Traceback (most recent call last):
File "client.py", line 18, in <module>
post(40846)
File "client.py", line 13, in post
r = requests.post("http://127.0.0.1:5000/post", files=files)
File "/opt/python_env/renter/lib/python2.7/site-packages/requests/api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "/opt/python_env/renter/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/opt/python_env/renter/lib/python2.7/site-packages/requests/sessions.py", line 357, in request
resp = self.send(prep, **send_kwargs)
File "/opt/python_env/renter/lib/python2.7/site-packages/requests/sessions.py", line 460, in send
r = adapter.send(request, **kwargs)
File "/opt/python_env/renter/lib/python2.7/site-packages/requests/adapters.py", line 354, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=5000): Max retries exceeded with url: /post (Caused by <class 'socket.error'>: [Errno 32] Broken pipe)
meine Versionen
$ pip freeze
Flask==0.10.1
Flask-Mail==0.9.0
Flask-SQLAlchemy==1.0
Flask-Uploads==0.1.3
Jinja2==2.7.1
MarkupSafe==0.18
MySQL-python==1.2.4
Pillow==2.1.0
SQLAlchemy==0.8.2
Werkzeug==0.9.4
blinker==1.3
itsdangerous==0.23
passlib==1.6.1
python-dateutil==2.1
requests==2.0.0
simplejson==3.3.0
six==1.4.1
virtualenv==1.10.1
voluptuous==0.8.1
wsgiref==0.1.2
InformationsquelleAutor Arlukin | 2013-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
RFC 2616, die Spezifikation für HTTP 1.1, der sagt:
Dies ist, was passiert hier: Kolben schließen der Verbindung zu verhindern, dass der client von der Fortsetzung der upload, der Ihnen die
Broken pipe
Fehler.InformationsquelleAutor Christian Ternus
Kolben schließen der Verbindung, können Sie eine Fehlerbehandlung für den Fehler 413:
Nun sollte der client zu bekommen 413 Fehler, Hinweis, dass ich nicht diesen code testen.
Update:
Versuchte ich neu zu den 413 Fehler, und ich habe nicht ein ConnectionError Ausnahme.
Hier ein kurzes Beispiel:
Nach dem ausführen der Datei, habe ich das terminal zum testen Anfragen und versenden großer Daten:
Wie Sie sehen können, haben wir eine Antwort von Flasche 413 Fehler und Anfragen, die nicht zu einer Ausnahme.
Übrigens bin ich mit:
Ich aktualisiert meine Frage mit einem Beispiel, basierend auf Ihre Beispiele. Der Unterschied in meinem Beispiel ist, dass ich mit "Datei" anstelle von "Daten". Und es sieht aus wie ich fand, einige Puffer-Größe oder was es ist.
Ich versuchte Ihren code, und es funktioniert einwandfrei, und ich bin immer ein 413 Fehler und keine Ausnahmen auch bei größeren Dateien, ich benutze die gleichen Versionen wie die Eure, und ich bin mit Python 2.7.5, auf jeden Fall werde ich versuchen, es herauszufinden, und aktualisieren Sie meine Antwort.
InformationsquelleAutor Pierre