Теперь я знаком с общей причиной этой проблемы из другого ответа SO и из документации uWSGI , в которой говорится:
ЕслиHTTP-запрос имеет тело (например, запрос POST, сгенерированный формой), вы должны прочитать (использовать) его в своем приложении. Если вы этого не сделаете, сокет связи с вашим веб-сервером может быть засорен.
Однако я не понимаю, что именно происходит на уровне TCP для возникновения этой проблемы. Не зная деталей этого процесса, я бы предположил, что сервер может просто отбросить то, что остается в потоке, но это явно не так.
Если я использую только часть тела запроса в моем приложении и в конечном итоге возвращаюв ответе 200 веб-браузер сообщит об ошибке сброса соединения. Кто сбросил соединение? Веб-сервер или клиент? Кажется, что все данные уже отправлены клиентом, но приложение просто не исчерпало поток. Есть ли что-то, что происходит, когда поток исчерпан в приложении, которое запускает веб-сервер, чтобы показать, что оно завершило чтение?
Мое приложение - Python / Flask, но я видел вопросы по этому поводу из нескольких языков и фреймворков,Например, происходит сбой, если exhaust()
не вызывается в потоке запросов:
@app.route('/upload', methods=['POST'])
def handle-upload():
file = request.stream
pandas.read_csv(file, nrows=100)
response = # Do stuff
file.exhaust()
return jsonify(response)