how to customize simplejwt error response message in django restframework

# 1. Import necessary modules and classes
from rest_framework_simplejwt.views import TokenError, TokenViewBase
from rest_framework_simplejwt.tokens import Token
from rest_framework.response import Response

# 2. Create a custom exception class for your error
class CustomTokenError(TokenError):
    def __init__(self, detail=None):
        self.detail = detail or "Custom error message."

# 3. Create a custom view class that inherits from TokenViewBase
class CustomTokenView(TokenViewBase):
    def get_response(self, serializer):
        # Check if there are any errors in the serializer
        if serializer.errors:
            # Customize the error message
            error_message = "Custom error message."

            # Create a custom exception instance with the error message
            custom_error = CustomTokenError(detail=error_message)

            # Raise the custom exception
            raise custom_error

        # Call the parent class method to get the default response
        response = super().get_response(serializer)

        # Customize the response data if needed
        # For example, you can modify the 'access' and 'refresh' token keys
        response.data['my_custom_access'] = response.data.pop('access')
        response.data['my_custom_refresh'] = response.data.pop('refresh')

        return response

# 4. Update your URL configuration to use the custom view
from django.urls import path
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    path('token/', CustomTokenView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

In this example, a custom exception class (CustomTokenError) is created to handle the custom error message. The CustomTokenView class inherits from TokenViewBase, and the get_response method is overridden to customize the error message and modify the response data if needed. Finally, the URL configuration is updated to use the custom view (CustomTokenView) instead of the default TokenObtainPairView.