【问题标题】:Django InMemoryUploadedFile and asynchronous tasksDjango InMemoryUploadedFile 和异步任务
【发布时间】:2018-07-03 10:58:47
【问题描述】:

我有一个 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.

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

【问题讨论】:

  • 这就是您不以这种方式使用线程执行异步任务的原因之一。使用适当的任务队列。
  • 我知道使用像 Celeri 这样的服务会更好,但它如何帮助解决文件关闭问题?

标签: python django asynchronous large-file-upload


【解决方案1】:

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

简短的回答:你不能。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多