Django打印request.body出现额外分隔数据如何正确解析格式化
额外内容的含义
你打印出的字节串是标准multipart/form-data编码的POST请求体,是浏览器/HTTP客户端提交表单时的通用编码格式(常用于带文件上传的表单场景,普通表单字段也会用这种编码提交),你看到的非业务内容都是该编码规范的固定组成部分:
- 前缀
b'、后缀'是Python打印bytes类型对象的固定标记,代表这是字节序列而非普通字符串 ----------------------------914826831994362856243559是边界分隔符(boundary),由客户端发起请求时随机生成,作用是分割不同的表单字段;每个字段的起止位置都用该分隔符标记,请求体末尾的分隔符会额外加--后缀,标识整个请求体结束\r\n是HTTP协议规定的CRLF换行符,用来分隔请求头、字段头、字段内容- 每个字段块内的
Content-Disposition: form-data; name="xxx"是字段描述头,标记当前块为表单数据,name属性对应表单字段的键名 - 字段描述头和实际业务值之间会留一个空行(即连续两个
\r\n),空行后就是该字段对应的业务值
你的请求解析后实际业务字段如下:
- release_date: 2003-06-01
- fanmodel: fan234code
- country_code: AO
正确解析方式
不要手动通过字符串分割解析这类请求体,边界符转义、编码处理、文件字段兼容很容易出bug,优先使用你所用Web框架自带的请求解析能力,无框架场景可使用标准库工具解析:
框架场景(最常用)
- Flask:直接访问
request.form即可拿到解析后的字段字典,例如request.form.get('fanmodel')就能拿到对应值 - FastAPI:使用
Form()依赖注入声明参数即可,不需要手动读取request.body - Django:直接访问
request.POST即可获取解析完成的表单数据
无框架手动解析场景
Python 3.12及更早版本可直接使用标准库cgi模块解析,示例代码:
import cgi from io import BytesIO # 注意:boundary值必须从请求头的Content-Type字段动态获取,不要硬编码 # 请求头Content-Type格式参考:multipart/form-data; boundary=--------------------------914826831994362856243559 content_type = "替换成你实际请求的Content-Type头内容" request_body = b"替换成你读取到的request.body字节内容" form = cgi.FieldStorage( fp=BytesIO(request_body), headers={"content-type": content_type}, environ={"REQUEST_METHOD": "POST"} ) # 取值示例 release_date = form.getvalue("release_date") fanmodel = form.getvalue("fanmodel") country_code = form.getvalue("country_code")
Python 3.13版本移除了标准库的cgi模块,可使用官方维护的
multipart第三方库完成解析,调用逻辑基本一致。
内容的提问来源于stack exchange,提问作者coder_boy
相关产品推荐
相关产品推荐

