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

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'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:15:04