#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:
Наконец-то я нашел решение этой проблемы!
Я использую промежуточное программное обеспечение для версий в своем коде, меняю сортировку промежуточного программного обеспечения и размещаю промежуточное программное обеспечение над промежуточным программным обеспечением для версий, и все успешно работает!