如何从Playwright的Request对象中获取multipart/form-data类型表单数据
原因说明
Playwright Python SDK 目前未原生提供解析 multipart/form-data 类型请求表单的公开API,且默认不会缓冲包含大负载/上传文件的multipart请求体,所以你获取post_data、post_data_buffer、post_data_json三个属性都会返回None。
可用解决方案
方案:手动解析原始请求体
你可以配合第三方表单解析库python-multipart手动解析请求内容,步骤如下:
- 先安装依赖
pip install python-multipart
- 修改路由处理逻辑,示例代码如下:
from io import BytesIO from multipart import MultipartParser, parse_options_header from playwright.async_api import Route, Request async def handler(route: Route, request: Request): content_type = request.header_value("Content-Type") # 仅处理multipart类型的POST/PUT请求 if ( request.method in ["POST", "PUT"] and content_type and "multipart/form-data" in content_type ): # 解析multipart请求的boundary参数 _, options = parse_options_header(content_type) boundary = options.get("boundary", b"").decode() # 获取请求原始二进制内容 raw_body = (await request.fetch()).body() # 解析表单数据 parser = MultipartParser(BytesIO(raw_body), boundary) form_data = {} for part in parser: # 普通文本字段处理 if not part.filename: form_data[part.name] = part.raw_data.decode(part.charset or "utf-8") # 文件字段处理,可按需提取文件名、MIME类型、文件二进制内容 else: form_data[part.name] = { "filename": part.filename, "content_type": part.content_type, "content": part.raw_data } # 此处可对解析后的form_data做自定义处理 print(form_data) # 继续请求流程,不打断原有业务 await route.continue_() await page.route("**/*", handler=handler)
注意事项
- 如果你使用的Playwright版本低于1.30,建议先升级到最新版本,无文件的轻量multipart表单在高版本中可以直接通过
request.post_data_buffer获取原始内容 - 如果表单包含大体积上传文件,注意调整解析逻辑避免全量加载到内存导致OOM问题
request.fetch()方法不会重复发送请求,属于Playwright路由处理的标准内置方法,不会影响原有请求的正常执行
内容的提问来源于stack exchange,提问作者tmpm
相关产品推荐
相关产品推荐

