сохраните запрос Django2.2 404 в базе данных с помощью программного обеспечения middelware

#django #middleware #django-2.2

Вопрос:

я пишу пользовательское промежуточное программное обеспечение, чтобы сохранить все запросы в своей базе данных. это мой код:

 class TestMiddleware(MiddlewareMixin):
      def process_response(self, request, response):
           ....
           # save my request attr in database
           HttpRequestLog.objects.create(**params)
           ...

     def process_exception(self, request, exception):
           ....
           # save my request attr in database
           HttpRequestLog.objects.create(**params)
           ...
 

у меня проблема.
когда пользователь вызывает неверный URL api , Django возвращает статус 404, но этот код ничего не сохраняет в моей базе данных, и у меня нет никаких ошибок!!!

                HttpRequestLog.objects.create(**params)
 

мой код работает, когда api возвращает статус 200, 204 или 201.

Комментарии:

1. 404 часто выполняется с помощью исключения , а не ответа HTTP, поэтому вам нужно будет «поймать» ошибку, зарегистрировать ответ и повторить его.

2. я записываю его в process_exception, но он не работает!

3. @Sifb71 Из ваших настроек показывает MIDDLEWARE настройки.

4. @Abdul Aziz Barkat ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ = [… myapp.промежуточное программное обеспечение.request_log_middleware. Тестовое программное обеспечение … ]

5. мое промежуточное программное обеспечение работало, но я ничего не могу сохранить в базе данных, когда 404 accur..in 200 или 500 сработало!

Ответ №1:

404 часто выполняется с помощью исключения, а не ответа HTTP. Затем платформа Django преобразует это исключение в ответ HTTP 404.

Таким образом, вы можете «поймать» ошибку, зарегистрировать ответ и повторить его:

 class TestMiddleware(MiddlewareMixin):
    
    def process_response(self, request, response):
        …
        # save my request attr in database
        HttpRequestLog.objects.create(**params)

    def process_exception(self, request, exception):
        if isinstance(exception, Http404):
            # …
        return None 

Ответ №2:

Наконец-то я нашел решение этой проблемы!

Я использую промежуточное программное обеспечение для версий в своем коде, меняю сортировку промежуточного программного обеспечения и размещаю промежуточное программное обеспечение над промежуточным программным обеспечением для версий, и все успешно работает!