I want to write a middleware that log all requests which have not a successful (200 statuses) and using request.data
causes the error You cannot access body after reading from request's data stream
and when I do something like request_clone = copy.copy(request)
and then using it’s body, it’s empty.
I would think you’d be looking for the status_code attribute of the response object.
What are you looking to retrieve from the request object?
(You could make a copy of what you need from the request object before passing the request to the view, then using that information along with the status_code after the view has been executed.)
As I’ve stated, tried to copy the request
itself but the body
property is empty.
I think we’d need to see your middleware code to be able to provide any further assistance.
When posting code here, please enclose it between lines consisting only of three backtick (`) characters. This means you’ll have a line that is only ```, followed by your code, followed by another line of ```. This allows your code to remain formatted.
It’s my middleware code:
class RequestLoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
self.logger = logging.getLogger("portal.request")
def __call__(self, request):
response = self.get_response(request)
request_log = (
f"REQUEST\n\tHEADERS\n{request.headers}\n\tBODY\n{request.read()}"
)
if hasattr(response, "rendered_content"):
response_log = (
f"RESPONSE\n\tHEADERS\n{response.headers}"
f"\n\tBODY\n{response.rendered_content}"
)
else:
response_log = (
f"RESPONSE\n\tHEADERS\n{response.headers}"
f"\n\tBODY\n{response.content}"
)
if not status.is_success(response.status_code):
self.logger.info(
f"{request.path} {response.status_code}"
f" {response.reason_phrase}\n{request_log}\n\n{response_log}"
)
return response
I can’t get your point, would you mind providing a short code snippet of what I would do?
I’ve read the docs, and currently viewing the source code but I doubt I missed your point.
I copy the request object like this request_clone = copy.copy(request)
so it should be OK to access the clone object body, but it gives me Error and if I use request_clone.read()
it’s empty.
Tnx BTW, I fixed it by copying just the request.body
part.
Happy Coding