Django InMemoryUploadedFile и асинхронные задачи - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение django, в которое я загружаю несколько файлов огромного размера. На мой взгляд, я хочу выполнить асинхронную задачу для этих файлов:

def my_view(request):
    Thread(target=_my_task, args=[request.FILES]).start())
    return redirect(my_url)

Проблема в том, что к тому времени, когда я использую файлы в своем потоке, основной запрос завершен, и объект запроса удаляется вместе с содержащимися в нем объектами InMemoryUploadedFile, и я получаю исключение ввода-вывода:

ValueError: I/O operation on closed file.

Как я могу принудительно сохранить эти файлы, не записывая их в мою файловую систему?

1 Ответ

0 голосов
/ 03 июля 2018

Как я могу принудительно сохранить эти файлы без записи в мою файловую систему?

Краткий ответ: вы не можете.

Самый длинный ответ: вы могли бы передавать содержимое файлов вместо файловых объектов, но в лучшем случае это небезопасно (если что-то идет не так, вы теряете свои данные) и громоздко (когда вы переключаетесь на правильная очередь задач - многопоточность НЕ является правильным способом запуска асинхронных задач в Django - вы обнаружите, что передача мегабайтов или гигабайт данных бинарности в качестве аргумента задач, по меньшей мере, не работает).

TL; DR: сохраните ваши файлы на диск тем или иным способом (желательно в вашей файловой системе, вот для чего он) и используйте правильную очередь асинхронных задач.

...