我有一个在 Django 中返回 JsonResponse 的视图
def some_view(request):
return JsonResponse({'a': 1, 'b': 2})
在同一个项目的其他地方,我有一段代码将 GET 请求发送到与该视图相对应的 url:
import requests
def client_func():
requests.get(url_to_some_views)
它可以在我的本地计算机上运行,但部署到heroku后,有时我会收到错误:
('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
经过一些测试,我发现
some_view
的响应头中有一个额外的字段:transfer-encoding: chunked
所以我猜这可能是导致问题的原因,但我仍然不知道如何处理这个问题。到目前为止,我已尝试将 stream=True
添加到 client_func
中的 get 调用中,但问题仍然存在。
有人可以帮我解决这可能是我的问题的原因并解决这个问题吗?非常感谢!
发现问题了,这是因为我的 1 个 GET 请求有一个正文,它把事情搞砸了。
这是我在 Google 上绝望地搜索“IncompleteRead django”时到达的第一个地方,因为我从 Django 应用程序中得到了不完整的 JSON 响应。因此,虽然我的问题与原来的问题无关,但它有足够的症状重叠,我认为在这里给出我的解决方案是合适的。
事实证明,Django 或 NGINX 试图使用临时文件来存储非常大的 JSON 响应。然而,服务器硬盘驱动器已满,因此临时文件创建失败。这显然不会停止响应过程,因此我得到了不完整的 JSON 作为响应,总长度远低于预期。
释放主机上的空间解决了该问题。
特别值得注意的是,使用 Python requests 库发出原始请求并没有指示任何有关“IncompleteRead”的信息,但尝试在请求对象上调用
.json()
失败,因为 JSON 无效(由于截断)