Django InMemoryUploadedFile 和异步任务
Django InMemoryUploadedFile and asynchronous tasks
我有一个 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.
如何在不将这些文件写入我的文件系统的情况下强制保留这些文件?
How can I force the persistence of those files without writing them in my filesystem ?
简答:你不能。
最长的答案:你可以传递文件内容而不是文件对象,但这充其量是不安全的(如果出现任何问题你会丢失你的数据)并且很麻烦(当你会切换到一个合适的任务队列 - 线程不是 运行 在 Django 中异步任务的正确方法 - 你会发现将兆字节或千兆字节的二进制数据作为任务参数传递并不能很好地工作,到至少可以说)。
TL;DR:以一种或另一种方式将文件保存到磁盘(最好在您的文件系统上,这就是它的用途)并使用适当的异步任务队列。
我有一个 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.
如何在不将这些文件写入我的文件系统的情况下强制保留这些文件?
How can I force the persistence of those files without writing them in my filesystem ?
简答:你不能。
最长的答案:你可以传递文件内容而不是文件对象,但这充其量是不安全的(如果出现任何问题你会丢失你的数据)并且很麻烦(当你会切换到一个合适的任务队列 - 线程不是 运行 在 Django 中异步任务的正确方法 - 你会发现将兆字节或千兆字节的二进制数据作为任务参数传递并不能很好地工作,到至少可以说)。
TL;DR:以一种或另一种方式将文件保存到磁盘(最好在您的文件系统上,这就是它的用途)并使用适当的异步任务队列。