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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM