Как обрабатывать «413: слишком большой объект запроса» на сервере Python FlaskPython

Программы на Python
Ответить
Anonymous
 Как обрабатывать «413: слишком большой объект запроса» на сервере Python Flask

Сообщение Anonymous »

Я использую Flask-загрузку для загрузки файлов на свой сервер Flask. Максимально допустимый размер задается с помощью flaskext.uploads.patch_request_class(app, 16 * 1024 * 1024).

Мое клиентское приложение (модульный тест) использует запросы на публикацию слишком большого файла.

Я вижу, что мой сервер возвращает HTTP-ответ со статусом 413: Слишком большой объект запроса. Но клиент вызывает исключение в коде запросов

ConnectionError: HTTPConnectionPool(host='api.example.se', port=80): Max retries exceeded with url: /images (Caused by : [Errno 32] Broken pipe)


Я предполагаю, что сервер отключает принимающий сокет и отправляет ответ обратно клиенту. Но когда клиент получает сломанный сокет отправки, он вызывает исключение и пропускает ответ.

Вопросы:
  • Правильны ли мои предположения относительно загрузок Flask и запросов?
  • Правильна ли загрузка Flask и запрос обрабатывают ошибку 413?
  • Следует ли мне ожидать, что мой клиентский код вернет некоторый HTML-код, когда пост слишком большой?
Обновить

Вот простой пример, воспроизводящий мою проблему.

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)


результат от клиента

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
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 : [Errno 32] Broken pipe)


мои версии

$ 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


Подробнее здесь: https://stackoverflow.com/questions/194 ... ask-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»