| import logging |
| import traceback |
|
|
| from django.http import JsonResponse |
|
|
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| class ExceptionMiddleware: |
| """ |
| Middleware to catch exceptions and handle them with appropriate logging and JSON response. |
| """ |
|
|
| def __init__(self, get_response): |
| """ |
| Initializes the ExceptionMiddleware with the provided get_response function. |
| """ |
| self.get_response = get_response |
|
|
| def __call__(self, request): |
| """ |
| Process the request and call the next middleware or view function in the chain. |
| """ |
| response = self.get_response(request) |
| return response |
|
|
| def process_exception(self, request, exception): |
| """ |
| Called when a view function raises an exception. |
| """ |
| error_type = exception.__class__.__name__ |
| error_message = exception.args |
| logger.info(f"Error Type: {error_type} | Error Message: {error_message}") |
| logger.debug("Request Details: %s", request.__dict__) |
| logger.exception(traceback.format_exc()) |
|
|
| if isinstance(exception, KeyError): |
| status_code = 400 |
| message = f"Please Add Valid Data For {error_message[0]}" |
| error = "BAD_REQUEST" |
| elif isinstance(exception, AttributeError): |
| status_code = 500 |
| message = "Something Went Wrong. Please try again." |
| error = "SOMETHING_WENT_WRONG" |
| elif isinstance(exception, TypeError): |
| status_code = 500 |
| message = "Something Went Wrong. Please try again." |
| error = "SOMETHING_WENT_WRONG" |
| else: |
| status_code = 500 |
| message = "Something Went Wrong. Please try again." |
| error = "SOMETHING_WENT_WRONG" |
|
|
| return JsonResponse({"message": message, "error": repr(exception)}, status=status_code) |
|
|