Django Daphne大文件上传

时间:2018-10-29 17:55:28

标签: python django upload out-of-memory daphne

我有一个使用Channels和Daphne进行WebSocket通信的Django Web应用程序。我所有的websocket东西都正常运行,没有任何问题。

我的麻烦来自于我的服务器还允许我将文件上传到服务器的事实。小文件(甚至最大282mb)正在上传,并且工作正常,没有任何问题。

但是,大文件会产生<!DOCTYPE HTML> <html> <body> <script type="text/babel> class App extends React.Component { createCircles = () => { let circles = []; for(let i = 1; i <= this.props.count; i++){ circles.push(<div className = "smallCircle" id={'circle'+i} key={i}><code className="circles" id={'id'+i}>{i}</code></div>); } return circles; } render(){ return ( <div id="circles"> <div className = "bigCircle" id="bigCircle"> <img id="bigCircleImage" src="http://localhost" /> </div> <div className = "smallCircles"> {this.createCircles()} </div> </div> ); } } function AppLoader(){ return ( <App /> ); } ReactDOM.render(<AppLoader />, document.getElementById('root')); </script> <div id="root"></div> </body> </html> 并显示此堆栈跟踪:

500 Internal error - Daphne

我猜这是在告诉我达芙妮的内存不足。我在这里找到了参考:Online Babel Converter,这也有助于确认这一发现。

我需要一个解决的办法。我不在Docker内部运行我的项目,而是在Linux VM实例上。如果我增加了整个VM上使用的总RAM,daphne是否可以获取更多?

我可以通过某种方式指定daphne允许使用比当前更多的内存吗?该服务器实例具有4gb的RAM,我的文件只有675mb,因此,除非它一次将多个副本存储在内存中,否则它应该足以容纳该文件。

如何使Daphne能够成功接受大文件上传?

1 个答案:

答案 0 :(得分:0)

我发布了答案here

达芙妮过早地将整个HTTP POST请求正文加载到RAM中。如果您需要上传足够大的文件-您需要使用uvicorn而不是daphne。

daphne -p <your-port> -b <your-host> ...替换为uvicorn --port <your-port> --host <your-host> ...

此后,您必须编写自己的AsyncHttpConsumer,因为通道中的AsgiHandlerAsgiRequest也不支持分块正文。