python - 无法将 InMemoryUploadedFile 写入线程中的本地文件 - Python
问题描述
我的程序在 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.
问题是当我在不创建线程的情况下运行程序时,它可以工作。为什么在一个线程内它没有?我必须使用线程,因为我需要同时运行几个不同的此类服务。
解决方案
实际上,您不能使用传递给目标函数的 InMemoryUploadedFile 对象。您可以保存数据或传递文件的内容,尽管传递文件内容有点风险,因为您可能会丢失上传的数据。此外,尝试像 celery 这样的异步进程而不是线程。
推荐阅读
- ruby - Logstash 支持 BCFIPS 吗?如果是这样如何使 Log Stash 插件与 BFIPS 兼容?
- ruby-on-rails - rake routes 命令不起作用 - rake 版本 13.0.3
- r - 当行的其余部分重复时,如何通过对一列的值求和来合并表
- graphql - 如何将数组作为参数传递给 Nexus?如何使用 Prisma 从这个数组创建多个对象?
- javascript - 赛普拉斯 before() 钩子和 it() 测试有什么区别
- php - Xdebug 在 Mac m1 上安装失败
- flutter - Flutter - 我们可以使用 AspectRatio 来模拟整个应用程序的宽度,类似于宽桌面显示器上的设备吗?
- rest - 在放心的通话中出现不受支持的字符集“ISO-8859-1”错误
- java - 无法在 webview 中加载 fast.com
- flutter - 颤振错误 - _InheritedProviderScope
(值:'Provider'的实例,监听值)