Django中如何修改HttpRequest.body中的指定键值?
报错原因
request._body是Django HttpRequest对象中存储原始请求体字节串的属性,本身是bytes类型,不是可修改的字典结构,因此直接进行键值赋值会抛出类型错误。
解决方案
修改请求体需要先解析原始字节串为可操作的Python对象,修改完成后再重新序列化回字节串赋值给request._body,根据请求体格式不同有两种常见处理方式:
场景1:请求体为JSON格式(content-type: application/json)
import json def myview(request): # 解析原始字节串为字典 body_data = json.loads(request.body) # 修改指定键值 body_data['key1'] = 'value1' # 序列化回字节串后重新赋值给_request._body request._body = json.dumps(body_data).encode('utf-8') # 若使用DRF框架,需手动清除request.data缓存,避免读取旧值 if hasattr(request, '_full_data'): delattr(request, '_full_data') # 后续业务逻辑 ...
场景2:请求体为表单格式(content-type: application/x-www-form-urlencoded)
from django.http import QueryDict def myview(request): # 复制原始POST数据为可修改的QueryDict对象 post_data = request.POST.copy() # 修改指定键值 post_data['key1'] = 'value1' # 同步更新request._body和request.POST属性 request._body = post_data.urlencode().encode('utf-8') request.POST = post_data # 后续业务逻辑 ...
注意:直接修改HttpRequest的内置属性可能引发不可预知的副作用,非必要场景建议将修改后的数据单独存为变量传递给后续逻辑,不要直接修改请求对象本身。
内容的提问来源于stack exchange,提问作者Anirban Nag 'tintinmj'
相关产品推荐
相关产品推荐

