在异步上下文中按块写入上传的文件

问题描述 投票:0回答:0

我有一个 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
。 我相信这可能与文件是流的事实有关,但我不确定发生了什么。关于为什么以及如何解决这个问题的任何想法?

python django asynchronous python-asyncio
© www.soinside.com 2019 - 2024. All rights reserved.