2017-06-15 47 views
3

我存在的问题是,当向Django服务器发送一些请求时,它会在时间之前关闭连接。Django重置一些请求的连接

这里是simple project在Github上

下面是它的工作原理与任何机构简单的POST请求: enter image description here

但是,当我发送一些二进制数据,〜15MB大小,邮差会显示连接错误: enter image description here

卷曲工作正常

curl -X POST -d "@bin/ngrok" localhost:3000/test/ 

我认为这是Postman中的一些错误,但在移动设备上它也不起作用;

我试图比较请求标头。我试图折腾中间件。我尝试调试Djnago代码。但我可以找到解决方案。你能帮助我吗?在settings.py文件

UPDATE 1

设置

FILE_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 
DATA_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 

不能解决问题

UPDATE 2

我添加线print(len(request.body))索引方法:

@csrf_exempt 
def index(request): 
    print(len(request.body)) 

    return HttpResponse("Hello") 

现在它的工作。但为什么我应该提到身体完成请求? 在我的真实项目中,我检查身份验证令牌,如果它是错误的,我没有从身体读取任何东西。

+0

这是否为这是几MB的大小POST请求只发生? – dentemm

+0

我尝试了大小为70KB的文件,并且没问题。我试图改变DATA_UPLOAD_MAX_MEMORY_SIZE,但没有帮助 – atomAltera

回答

1

是的,我可以重现这与您的回购。

我看了一下Wireshark,看起来Django devserver实际上在整个有效负载发送之前都响应。我不确定HTTP规范是否说明了这是否正常,但很明显,一些客户端库(Postman和您的移动设备使用的)认为这是一个错误,而其他像libcurl这样的客户端库也可以。

当您添加print(len(request.body))时,它会强制Django(和底层堆栈)在输出响应之前消耗整个正文以便计算其长度。

在uwsgi下运行应用程序时,也会发生这种行为,因为它的价值。

的TCP流看起来像这样在Wireshark的: enter image description here

+0

好的,谢谢。可能有一些Django配置设置用于防止这种行为?它看起来丑陋的请求如果我在某些情况下不需要它, – atomAltera

+1

那么,你可以编写一个中间件,强制访问每个请求中的'request.POST'或'request.body'。尽管说实话,你的应用不应该张贴大的有效载荷到不指望他们的端点,如果你问我:) – AKX

0

几周前,我在Heroku上的一个项目中遇到了同样的问题。 Heroku日志显示不太有用的“服务器请求中断”错误。经过几天的调试和调查django源代码后,我发现它与django's Upload Handlers有关。

有一个名为FILE_UPLOAD_MAX_MEMORY_SIZE的设置,默认为2.5Mb。任何小于此设置的上传都将由MemoryFileUploadHandler(在内存中)处理,否则TemporaryFileUploadHandler负责文件处理。我从来没有发现为什么,但在Heroku上,TemporaryFileUploadHandler总是让我的应用程序崩溃。我通过将设置增加到客户端要上传的最大文件大小来创建解决方法。

+0

不幸设置FILE_UPLOAD_MAX_MEMORY_SIZE事件高达1000000000没有解决问题; – atomAltera

+0

请参阅更新1 – atomAltera

+0

太糟糕了:-(比我都想出来的想法恐怕... – dentemm