@@ -41,7 +41,6 @@ class LogRequestAndResponseMiddleware:
4141
4242 def __init__ (self , get_response ):
4343 self .get_response = get_response
44- self .request_body = None
4544 self .log_excluded_headers_set = set (
4645 map (str .lower , settings .LOG_EXCLUDED_HEADERS )
4746 )
@@ -50,9 +49,8 @@ def __call__(self, request: HttpRequest) -> HttpResponse:
5049 if not settings .LOG_MIDDLEWARE_ENABLED :
5150 return self .get_response (request )
5251
53- self .request_body = getattr (request , "body" , None )
54- response = self .get_response (request )
5552 self .process_request (request )
53+ response = self .get_response (request )
5654 self .process_response (request , response )
5755 return response
5856
@@ -70,15 +68,17 @@ def process_request(self, request):
7068 try :
7169 path = self ._empty_value_none (getattr (request , "path" , None ))
7270 method = self ._empty_value_none (getattr (request , "method" , None ))
71+ content_type = self ._empty_value_none (
72+ getattr (request , "content_type" , None )
73+ )
74+ request_body = self ._empty_value_none (getattr (request , "body" , None ))
7375 request_data = {
7476 "request" : {
75- "body" : self ._get_request_body (request ),
77+ "body" : self ._get_request_body (content_type , request_body ),
7678 "query_params" : self ._empty_value_none (
7779 getattr (request , "GET" , None )
7880 ),
79- "content_type" : self ._empty_value_none (
80- getattr (request , "content_type" , None )
81- ),
81+ "content_type" : content_type ,
8282 "method" : method ,
8383 "path" : path ,
8484 "headers" : self ._empty_value_none (
@@ -108,6 +108,14 @@ def process_response(self, request, response):
108108
109109 try :
110110 response_data = self ._abridge (getattr (response , "data" , None ))
111+ if response_data is None :
112+ response_content = self ._abridge (getattr (response , "content" , None ))
113+ content_type = self ._empty_value_none (
114+ getattr (request , "content_type" , None )
115+ )
116+ response_data = (
117+ self ._get_request_body (content_type , response_content ),
118+ )
111119 response_status_code = getattr (response , "status_code" , 0 )
112120 response_headers = self ._exclude_keys (getattr (response , "headers" , None ))
113121
@@ -255,15 +263,14 @@ def _exclude_keys(self, obj: Optional[Dict]) -> Optional[Dict]:
255263 if k .lower () not in self .log_excluded_headers_set
256264 }
257265
258- def _get_request_body (self , request ) -> Union [str , Dict , None ]:
266+ def _get_request_body (self , content_type , request_body ) -> Union [str , Dict , None ]:
259267 """
260268 Extract request body and mask sensitive data.
261269
262270 Example:
263271 Input: Django request object with JSON body {"key": "value" }
264272 Output: {"key": "value"}
265273 """
266- content_type = getattr (request , "content_type" , None )
267274
268275 def decode_and_abridge (body_bytes ):
269276 body_str = body_bytes .decode ("UTF-8" ) if body_bytes else None
@@ -276,9 +283,9 @@ def decode_and_abridge(body_bytes):
276283 if content_type == "multipart/form-data" :
277284 return "The image was uploaded to the server"
278285 elif content_type == "application/json" :
279- return self ._mask_sensitive_data (decode_and_abridge (self . request_body ))
286+ return self ._mask_sensitive_data (decode_and_abridge (request_body ))
280287 elif content_type == "text/plain" :
281- return self ._mask_sensitive_data (self ._abridge (self . request_body ))
288+ return self ._mask_sensitive_data (self ._abridge (request_body ))
282289 else :
283290 return self ._mask_sensitive_data (content_type )
284291
0 commit comments