Объект Django Middleware не может быть вызван

Я пытаюсь написать пользовательское промежуточное ПО для перехвата исключений и возврата соответствующего объекта HTTP Response. Но по какой-то причине я получаю ошибку "middleware object is not callable".

Я поднимаю исключение в слое представления, как показано ниже

class MyView(APIView):
  def post(self, request):
    result = some_func(request) #this func raises an exception
    return Response({"status": "Success", "data": result})

logs.

backend_1          | INFO:django:BEGIN -> c25db666-e89c-43a5-9f28-48001e301829 - /myapp/settings/create
backend_1          | {"message": "Internal Server Error: /myapp/settings/create", "exc_info": "Traceback (most recent call last):\n  File \"/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py\", line 47, in inner\n    response = get_response(request)\nTypeError: 'MyAppResponseMiddleware' object is not callable", "status_code": 500, "request": "<WSGIRequest: POST '/myapp/settings/create'>"}
backend_1          | ERROR:django.request:Internal Server Error: /crystal/settings/create
backend_1          | Traceback (most recent call last):
backend_1          |   File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
backend_1          |     response = get_response(request)
backend_1          | TypeError: 'MyAppResponseMiddleware' object is not callable 
  

files

#myapp/middleware.py
class MyAppResponseMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        
    def process_exception(self, request, exception):
        absolute_path = request.get_full_path()
        print(absolute_path)
        print(exception.__class__.name)
        print(exception.message)
    
#settings.py
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    ...
    ...
    <some custom middleware>
    ...
    "myapp.middleware.MyAppResponseMiddleware",
        ]    
        

Я добавил промежуточное ПО в последнее, чтобы мое промежуточное ПО поймало ответ/исключение до того, как другое промежуточное ПО обработает ответ.

Согласно документации Middleware должен быть callable (функция или класс с методом __call__) https://docs.djangoproject.com/en/4.0/topics/http/middleware/#writing-your-own-middleware

Структура должна быть такой:

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response
Вернуться на верх