Django InMemoryUploadedFile和异步任务

时间:2018-07-03 10:58:48

标签: python django asynchronous large-file-upload

我有一个django应用程序,在该应用程序上我上传了几个大文件。 在我看来,我想对这些文件执行异步任务:

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

问题是,当我在线程中使用文件时,主请求已完成,请求对象以及其中包含的InMemoryUploadedFile对象被删除,并且出现了IO异常:

ValueError: I/O operation on closed file.

如何在不将这些文件写入我的文件系统的情况下强制保留这些文件?

1 个答案:

答案 0 :(得分:1)

  

如何在不将这些文件写入我的文件系统的情况下强制保留这些文件?

简短的回答:您不能。

最长的答案:您可以传递文件内容而不是文件对象,但这充其量是不安全的(如果出现任何问题,您将丢失数据)并且麻烦(当您切换到适当的任务队列-线程不是在Django中运行异步任务的适当方法-至少可以说,将兆字节或数千兆字节的binaray数据作为任务参数传递是行不通的。

TL; DR:以一种或另一种方式(最好是在文件系统上)将文件保存到磁盘,并使用适当的异步任务队列。