我有一个 Python 异步函数从 Django API 端点以及 Django 表单接收
django.core.files.uploadedfile.TemporaryUploadedFile
。
一旦这个函数/协程被启动,它需要写入文件,并且由于文件很大Django建议使用
UploadedFile.chunks()
方法来这样做。
所以我有一个经典的同步方法,可以将文件分块写入目标路径,如下所示:
from pathlib import Path
from django.core.files.uploadedfile import TemporaryUploadedFile
def write_file(file: TemporaryUploadedFile, destination: Path) -> None:
with open(destination, "wb+") as out:
for chunk in file.chunks():
out.write(chunk)
如前所述,它是从异步上下文调用的,使用
asgiref.sync.sync_to_async
。主要功能逻辑如下所示:
from asgiref.sync import sync_to_async
from pathlib import Path
from django.core.files.uploadedfile import TemporaryUploadedFile
async def process_submission(file: TemporaryUploadedFile) -> None:
... do stuff ...
await sync_to_async(write_file)(file=file, destination=Path("/my_path.mp4"))
... do other stuff ...
...但我得到错误
ValueError: read of closed file
。
我相信这可能与文件是流的事实有关,但我不确定发生了什么。关于为什么以及如何解决这个问题的任何想法?