Джанго Дафна загрузка больших файлов - PullRequest
0 голосов
/ 29 октября 2018

У меня есть веб-приложение Django, которое использует каналы и Daphne для связи через веб-сокет. Все мои вещи с веб-сокетом работают без проблем.

Моя проблема связана с тем, что мой сервер также позволяет мне загружать файлы на сервер. Небольшие файлы (даже до 282 МБ) загружаются и работают без проблем.

Однако большие файлы приводят к 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

Полагаю, это говорит мне о том, что у Дафни заканчивается память. Я нашел ссылку здесь: Ограничения на размер загружаемого файла Дафни Джанго , что также помогает подтвердить этот вывод.

Мне нужен ответ, как его решить. Я не запускаю свой проект в Docker, я нахожусь на экземпляре виртуальной машины Linux. Если я увеличу общий объем используемой оперативной памяти на всей виртуальной машине, сможет ли Дафни получить еще?

Есть ли какой-нибудь способ, которым я могу указать дафне, что ей разрешено использовать больше памяти, чем в настоящее время? Этот экземпляр сервера имеет 4 ГБ ОЗУ, а мой файл - всего 675 МБ, поэтому, если он не хранит несколько копий в памяти одновременно, его должно быть достаточно, чтобы уместить этот файл как есть.

Как я могу позволить Дафни успешно принимать большие загрузки файлов?

1 Ответ

0 голосов
/ 19 марта 2019

Я разместил ответ здесь .

Дафна избыточно и преждевременно загружает все тело запроса HTTP POST в ОЗУ. Если вам нужно загрузить достаточно большие файлы - вам нужно использовать uvicorn вместо daphne.

Заменить daphne -p <your-port> -b <your-host> ... на uvicorn --port <your-port> --host <your-host> ...

После этого вы должны написать свои AsyncHttpConsumer, потому что AsgiHandler и AsgiRequest из каналов не поддерживают кусковое тело.

...