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),它可以直接写入流响应
,但是如果有一个方便的库函数,使用它似乎更好。问题在于如何使用它,因为文档不清楚。