django 修改 request 对象中的请求参数, 并重新赋值给 request 对象

直接上代码, 实现流程看代码及注释

复制代码
def your_view(self, request):

    method = request.method

    if method == "GET":
        # 使用 querydict对象的copy()方法, 获取一个可修改的querydict
        data = request.GET.copy()
        # 修改参数值
        data = params_replace(data)
        if data:
            request.GET = data

    # 当请求方式是其他请求方法时
    else:
        try:
            # 如果body是json数据, 先转换为字典
      # 注意:这里如果是上传文件, 会报 UnicodeDecodeError 异常, 需要根据实际业务决定是否需要进行异常处理
params = eval(request.body.decode(encoding="utf-8")) machine_version = params.get("username") if machine_version: params["username"] = machine_version.replace("-", " ")
      # 重新构造请求体, 进行编码后, 重新赋值给 request._body
      # 注意是 request._body, 因为 request.body 是不可修改的, 但是 body 属性继承自 _body 属性, 所以直接修改 _body 属性
request._body
= json.dumps(params).encode(encoding="utf-8") except: # 如果body是key1=value1&key2=value2的参数形式 new_params = list() # 直接获取 body, 请求体里的二进制数据, 解码后, 进行切割 for param in request.body.decode().split("&"): if "username" in param: # 修改参数值, 并重新拼接参数 new_str = "username=" + param.split("=")[1].replace("-", " ") new_params.append(new_str) else: new_params.append(param) # 重新构造请求体, 进行编码后, 重新赋值给 request._body # 注意是 request._body, 因为 request.body 是不可修改的, 但是 body 属性继承自 _body 属性, 所以直接修改 _body 属性 request._body = "&".join(new_params).encode(encoding="utf-8") ... def params_replace(self, data): # 按需求, 对请求参数中的值做出修改 name = data.get("username") if name: data["username"] = name.replace("-", " ") return data else: return None
复制代码

 

HttpRequest 部分源码(关于body属性), 完整源码: https://docs.djangoproject.com/en/2.0/_modules/django/http/request/#HttpRequest

复制代码
class HttpRequest:
    @property
    def body(self):
        if not hasattr(self, '_body'):
            if self._read_started:
                raise RawPostDataException("You cannot access body after reading from request's data stream")
    
            # Limit the maximum request data size that will be handled in-memory.
            if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
                    int(self.META.get('CONTENT_LENGTH') or 0) > settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
                raise RequestDataTooBig('Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')

            try:
                self._body = self.read()
            except IOError as e:
                raise UnreadablePostError(*e.args) from e
            self._stream = BytesIO(self._body)
        return self._body
复制代码

 

 

 

 

posted @   lowmanisbusy  阅读(5994)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示