Объект 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