【发布时间】:2015-05-03 22:42:46
【问题描述】:
当 django 使用 mod_wsgi 部署在 apache 上时。它似乎以一种非常奇怪的方式处理不完整或取消的请求。
如果客户端取消请求,被取消的请求在django上并没有被取消,例如,如果你正在上传一个大文件,显然请求的body会被实际流式传输,所以django在读取body的同时,客户端取消请求,它仍在处理中(只是不完整)并且从未注意到实际的请求取消操作。
这是一个来自 apache 的日志示例,当请求被取消时。 [Fri May 01 22:05:51.055968 2015] [:error] [pid 31609] (70008) 部分结果有效但处理不完整:[client 172.31.43.91:3645] mod_wsgi (pid=31609): Unable to get bucket旅请求。
然后在 django 代码上,实际的 POST 字典永远不会构建(因为请求不完整,但它到达 django 并像有数据一样被处理),因此 django 在尝试获取数据时会失败(并且返回缺少的 XX 字段错误,或者处理它们的逻辑做什么)
最后,当 django 尝试写回响应时,显然会失败,并且客户端已经关闭了连接。
这种情况经常发生在用作移动应用程序的 REST 服务端点的请求上。移动应用上传大文件,因此请求在应用挂起/关闭时被取消,但服务器似乎总是收到部分请求。
发生这种情况时的完整日志如下所示:
[Fri May 01 22:05:51.055968 2015] [:error] [pid 31609] (70008)部分结果有效但处理不完整:[client 172.31.43.91:3645] mod_wsgi (pid=31609): Unable得到桶大队的请求。
[Fri May 01 22:05:51.062690 2015] [:error] [pid 10580] 一些与此处缺少数据相关的错误消息
[Fri May 01 22:05:51.068790 2015] [:error] [pid 10580] [remote 172.31.43.91:0] mod_wsgi (pid=10580): 处理 WSGI 脚本“some-path/wsgi.py”时出现异常'。
[Fri May 01 22:05:51.068827 2015] [:error] [pid 10580] [remote 172.31.43.91:0] IOError: failed to write data
现在最后一个问题是,有没有办法检测这种不完整的请求并相应地处理它,而不是稍后因为缺少所需的数据而失败?
【问题讨论】: