Django InMemoryUploadedFile и асинхронные задачи

У меня есть приложение 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.

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


person Charles-Edouard Lecat    schedule 03.07.2018    source источник
comment
Это одна из причин, почему вы не выполняете асинхронные задачи с потоками таким образом. используйте правильную очередь задач.   -  person    schedule 03.07.2018
comment
Я понимаю, что использование службы, такой как Celeri, было бы лучше, но как это помогает с проблемой закрытия файла?   -  person Charles-Edouard Lecat    schedule 03.07.2018


Ответы (1)


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

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

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

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

person bruno desthuilliers    schedule 03.07.2018