【问题标题】:Django Daphne large file uploadsDjango Daphne 大文件上传
【发布时间】:2023-03-21 03:30:01
【问题描述】:

我有一个 Django Web 应用程序,它使用 Channels 和 Daphne 进行 websocket 通信。我所有的 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 内存不足。我在这里找到了参考资料:Daphne Django file upload size limitations,这也有助于确认这一发现。

我需要回答的是如何解决它。我没有在 Docker 中运行我的项目,而是在 Linux VM 实例上。如果我增加整个 VM 上使用的总 RAM,daphne 是否能够获得更多?

有没有什么方法可以让 daphne 使用比当前更多的内存?这个服务器实例有 4gb 的 RAM,而我的文件只有 675mb,所以除非它一次在内存中存储多个副本,否则它应该有足够的容量来容纳这个文件。

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

【问题讨论】:

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


    【解决方案1】:

    我发布了答案here

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2021-09-27
      • 1970-01-01
      • 2011-08-11
      • 2011-11-28
      • 2021-08-21
      • 2013-03-13
      相关资源
      最近更新 更多