我现在从another SO answer和the uWSGI documentation熟悉了此问题的一般原因,其中指出:
如果HTTP请求具有主体(例如, 表单),则必须在应用程序中阅读(使用)它。如果你这样做 不这样做,与您的网络服务器的通讯套接字可能是 崩溃了。
但是,我不知道在TCP级别上到底发生了什么,此问题才发生。不知道此过程的细节,我假设服务器可以简单地丢弃流中剩余的内容,但是显然不是这种情况。
如果我仅消耗应用程序中部分请求主体并最终返回200响应,则Web浏览器将报告连接重置错误。谁重置连接?网络服务器还是客户端?似乎所有数据都已经由客户端发送,但是应用程序还没有耗尽流。当应用程序中的流耗尽时,会触发Web服务器指示其已完成读取吗?
我的应用程序是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)
答案 0 :(得分:1)
尽管整个链中都有一些缓冲,但是大文件传输要等到接收者消耗掉它们之后才能完成。缓冲区将填满,数据包将被丢弃,直到缓冲区被耗尽。最终,浏览器将放弃尝试发送文件并断开连接的操作。