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
.