我正在尝试异步发送一些多部分编码表单数据作为 post 请求,主要是文件和其他两个字段。
在尝试使用 asyncio 之前,我使用 requests-toolbelt 的 MultipartEncoder
(https://github.com/requests/toolbelt) 同步执行进程,对于普通请求效果很好,但在使用 aiohttp 进行异步操作时却无法正常工作。aiohttp 提供了两个多部分类,一个是 FormData()
类,另一个是 MultipartWriter()
类,但都没有给我带来太多成功。
经过一些测试,似乎使用 toolbelt 的 MultipartEncoder()
时,请求将按照应该的方式将数据发送到 post 请求的 form
部分。然而,当使用 aiohttp 时,请求被放置在请求的 body
部分中。不确定它们为什么会有不同的表现。
def multipartencode() -> ClientResponse():
# Using MultipartEncoder
m = MultipartEncoder(
fields={'type': type_str,
'metadata': json.dumps(metadata),
'file': (filename, file, 'application/json')}
)
# Using FormData
data = FormData()
data.add_field('file', file, filename=filename,
content_type='multipart/form-data')
data.add_field('type', type_str, content_type='multipart/form-data')
data.add_field('metadata', json.dumps(metadata),
content_type='multipart/form-data')
# Using MultipartWriter
with MultipartWriter('multipart/form-data') as mpwriter:
part = mpwriter.append(
file, {'CONTENT-TYPE': 'multipart/form-data'})
part.set_content_disposition('form-data')
part = mpwriter.append_form([('type', type_str)])
part.set_content_disposition('form-data')
part = mpwriter.append_form([('metadata', json.dumps(metadata))])
part.set_content_disposition('form-data')
# send request with ClientSession()
resp = await session.post(url=url, data=data, headers=headers)
return resp
我应该如何正确地格式化/构建多部分编码的请求,以便使用aiohttp发送?