我有一个使用Channels和Daphne进行WebSocket通信的Django Web应用程序。我所有的websocket东西都正常运行,没有任何问题。
我的麻烦来自于我的服务器还允许我将文件上传到服务器的事实。小文件(甚至最大282mb)正在上传,并且工作正常,没有任何问题。
但是,大文件会导致500 Internal error - Daphne
并显示此堆栈跟踪:
2018-10-29 12:40:14,009 - ERROR - http_protocol - Traceback (most recent call last):
File "..\venv\lib\site-packages\daphne\http_protocol.py", line 176, in process
"body": self.content.read(),
MemoryError
我猜这是在告诉我达芙妮的内存不足。我在这里找到了参考文献:Daphne Django file upload size limitations,这也有助于确认这一发现。
我需要一个答案是如何解决它。我不在Docker内部运行我的项目,而是在Linux VM实例上。如果我增加了整个VM上使用的总RAM,daphne是否可以抢到更多?
我有什么办法可以指定给daphne使用比当前更多的内存?该服务器实例具有4gb的RAM,我的文件只有675mb,因此,除非它一次将多个副本存储在内存中,否则它应该足以容纳该文件。
如何使Daphne能够成功接受大文件上传?
最佳答案
我发布了答案here。
达芙妮过早地将整个HTTP POST请求正文加载到RAM中。如果您需要上传足够大的文件-您需要使用uvicorn而不是daphne。
将daphne -p <your-port> -b <your-host> ...
替换为uvicorn --port <your-port> --host <your-host> ...
之后,您必须编写自己的AsyncHttpConsumer
,因为通道中的AsgiHandler
和AsgiRequest
也不支持分块正文。
关于python - Django Daphne大文件上传,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53051240/