Вы сказали:
В идеале я бы хотел, чтобы apache обрабатывал загрузку и передавал ее в django, когда весь файл был загружен.
Увы, HTTP на самом деле не работает таким образом. Проблема заключается в том, что тела запросов http могут быть файлами, или они могут быть очередями сообщений или каким-либо другим творческим использованием (возможно, пустым) потока октетов. Во-первых, это означает, что для сервера приложений будет неправильным решать, как обрабатывать тело запроса; Приложению может потребоваться прочитать часть запроса, и, если оно не пройдет проверку (скажем, неверные учетные данные для проверки подлинности или по любой другой причине), оно может закрыть соединение, прежде чем какая-либо полоса пропускания будет выделена для неверного запроса.
Это особенно актуально, когда запросы могут иметь произвольный, неограниченный размер (например, с использованием кодировки передачи по частям). Сервер приложений может элегантно абстрагировать тело запроса в простой файловый поток, но не может принять лучшего решения относительно его окончательной судьбы, чем этот.
По этой причине HTTP-серверы обычно вызывают приложение , как только все заголовки прочитаны , с телом запроса, готовым к потоковой передаче, если приложение желает.
С другой стороны, именно прикладные инфраструктуры работают для абстрагирования от общего использования, и django делает это, позволяя вам установить предпочтительный каталог загрузки и максимальный размер файла, а также некоторые другие параметры. Однако это все еще тесно связано с ограничениями, налагаемыми соображениями HTTP, как упомянуто выше. Обычно это работает достаточно хорошо, потому что большинство серверов обеспечивают достаточную пропускную способность и рабочие потоки для эффективного использования оборудования. Типичный рабочий пул (скажем, 5-50 одновременных потоков / процессов), все обслуживающие закачки файлов, вероятно, не оставляют на машине сервера какой-либо доступный ввод-вывод для обслуживания других запросов в любом случае.
Если ваше приложение не вписывается в эту модель, возможно, большинство запросов на самом деле связаны с процессором или обычно работают в оперативной памяти, но только несколько запросов выполняют дисковый ввод-вывод для загрузки файлов, тогда вам все равно придется выполнить некоторую пользовательскую настройку, Например, вам может потребоваться реорганизовать вашу службу в асинхронную среду, чтобы вы могли эффективно обрабатывать от тысячи до сотен тысяч одновременных, но медленных запросов или просто балансировать различные типы запросов на разных серверах приложений. Apache - хороший сервер приложений общего назначения, но он редко самый быстрый для конкретного приложения.