You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:48:34