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

Schreibe einen Kommentar