【问题标题】:Cannot Write InMemoryUploadedFile to Local File in Thread - Python无法将 InMemoryUploadedFile 写入线程中的本地文件 - Python
【发布时间】:2018-10-16 07:35:04
【问题描述】:

我的程序在 Django 中。我从 js request.FILES 中获取上传的文件:

my_docs = {}
for doc_title in request.FILES:
    doc_name = request.FILES[doc_title].name
    doc = request.FILES[doc_title]
    my_docs[doc_name] = doc

并将它们传递给具有“save_docs”方法的服务对象:

class MyService():
    def __init__(my_docs):
        self.my_docs = my_docs
...
    def save_docs(self):
        for my_doc in self.my_docs:
            with open(os.path.join(self.localfile_path,my_doc),'wb+') as destination:
                for chunk in self.my_docs[my_doc].chunks():
                        destination.write(chunk)
            #destination.close()

    def process(self):
    ...
        self.save_docs()
    ...
...

并创建一个线程然后调用它:

my_service = MyService(my_docs)
platform_thread = threading.Thread(target=my_service.process)
platform_thread.start()

但是有错误:

self._target(*self._args, **self._kwargs)
      File "/Users/xxxx/eclipse-workspace/My/my.py", line 97, in process
        self.save_docs()
      File "/Users/xxxx/eclipse-workspace/My/my.py", line 39, in save_docs
        for chunk in self.my_docs[my_doc].chunks():
      File "/Users/xxxx/Library/Python/3.7/lib/python/site-packages/django/core/files/uploadedfile.py", line 91, in chunks
        self.file.seek(0)
    ValueError: I/O operation on closed file.

问题是当我在不创建线程的情况下运行程序时,它可以工作。为什么在一个线程内它没有?我必须使用线程,因为我需要同时运行几个不同的此类服务。

【问题讨论】:

    标签: python django multithreading


    【解决方案1】:

    实际上,您不能使用传递给目标函数的 InMemoryUploadedFile 对象。您可以保存数据或传递文件的内容,尽管传递文件内容有点冒险,因为您可能会丢失上传的数据。此外,请尝试使用 celery 之类的东西作为异步进程而不是线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多