Python 使用aiohttp';具有StreamResponse的s MultipartWriter

Python 使用aiohttp';具有StreamResponse的s MultipartWriter,python,streaming,multipart,aiohttp,Python,Streaming,Multipart,Aiohttp,我正在尝试创建一个数据端点,该端点流式传输整个文件或适当地响应范围请求。流式传输整个文件似乎可以理解,但我不清楚如何处理范围请求。特别是,我看不出aiohttp.MultipartWriter如何写入StreamResponse 到目前为止,这是我的代码的一种抽象形式: from aiohttp.web import Request, StreamResponse from aiohttp.multipart import MultipartWriter async def data_hand

我正在尝试创建一个数据端点,该端点流式传输整个文件或适当地响应范围请求。流式传输整个文件似乎可以理解,但我不清楚如何处理范围请求。特别是,我看不出
aiohttp.MultipartWriter
如何写入
StreamResponse

到目前为止,这是我的代码的一种抽象形式:

from aiohttp.web import Request, StreamResponse
from aiohttp.multipart import MultipartWriter

async def data_handler(req:Request) -> StreamResponse:
    is_range_request = "Range" in req.headers

    with open("my_big_file", "rb") as f:
        if is_range_request:
            status_code = 202
            content_type = "multipart/bytes"
        else:
            status_code = 200
            content_type = "application/octet-stream"

        resp = SteamResponse(status=status_code, headers={"Content-Type": content_type})
        resp.enable_chunked_encoding()
        resp.enable_compression()

        await resp.prepare(req)

        if is_range_request:
            # _parse_range_header :: str -> List[ByteRange]
            # ByteRange = Tuple[int, int]  i.e., "from" and "to", inclusive
            ranges = _parse_range_header(req.headers["Range"])

            mpwriter = MultipartWriter("bytes")

            for r in ranges:
                range_from, range_to = r
                range_size = (range_to - range_from) + 1
                range_header = {"Content-Type": "application/octet-stream"}

                # FIXME Won't this block?
                f.seek(range_from)
                mpwriter.append(f.read(range_size), range_header)

            # TODO Write to response. How?...

        else:
            while True:
                data = f.read(8192)
                if not data:
                    await resp.drain()
                    break

                 resp.write(data)

    return resp

这也不会返回响应,直到它结束。这在我看来并不正确:在响应返回之前,上游调用如何知道发生了什么;或者是
asyncio
的东西自动为我做了这件事?

希望这有帮助:谢谢,但它没有。我已经阅读了RFC和aiohttp的文档。我可以实现我自己的多部分编写器(基于上述RFC),它可以直接写入
流响应
,但是如果有一个方便的库函数,使用它似乎更好。问题在于如何使用它,因为文档不清楚。