Django загружает большие файлы: требуется время, чтобы дойти до первой строки просмотра
У меня есть простое представление, которое получает файл
def upload_file(request):
print("first line")
....
Здесь, когда я загружаю файл размером 800 MB, печать first line занимает 5-10 секунд или больше
Определенно я ожидаю, что это займет время, когда я пытаюсь получить к нему доступ, например upload_file = request.data['file'], потому что он должен создать копию файла в /tmp. Но здесь даже до этого требуется много времени.
Я надеюсь, что ему требуется время для создания самого объекта запроса.
Или это время, которое проходит от браузера до django
Я просто хотел знать, что занимает время
Мой код начинается только после того, как мы получим объект запроса
Это неверно (по крайней мере, верно только наполовину).
Вы должны понимать request поток
Это довольно хорошая картинка (оригинальный URL):
Ваш upload_file созерцает в нижней части рисунка (View). Как раз в середине потока.
Здесь нет информации о том, какое Middleware вы используете (даже если это не ваш код). Были ли у вас собственные Middleware? Переопределяли ли вы View классы? И т.д.
Но согласно информации, которую вы добавили, можно предположить, что запрос файлового потока должен быть завершен, прежде чем Middlewares сможет обработать и проверить его. По какой-то логике Django решает, что данные потокового запроса большие и не могут храниться в памяти.
Итак, возможный поток данных будет таким (Просто мое непроверенное предположение):
- Обработка
requestпервым Middleware - Сохраните данные запроса потока в каталоге
/tmp - Вручение
requestдругими Middleware - Handle
requestнекоторыми методами предварительной обработки View (если они существуют) - Обращение
requestк вашейupload_fileфункции - Скопируйте файл из
/tmpв постоянный каталог и переименуйте его - Удалить временный файл (или удалить его после ответа ⑧) .
- Отправьте
responseна Middlewares снова
Так что здесь трудно предположить, что именно происходит в вашем коде (или внутри всех сторонних библиотек и Middlewares, которые вы используете).
Если вы хотите обрабатывать объект потокового запроса немедленно, добавьте собственный Middleware как первый элемент settings.MIDDLEWARE.
