【问题标题】:save Django2.2 404 request in database using middelware使用中间件将 Django 2.2 404 请求保存在数据库中
【发布时间】:2021-03-16 11:34:21
【问题描述】:

我编写了一个自定义 middilware 来将所有请求保存在我的数据库中。 这是我的代码:

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 apis 时,Django 返回 404 状态但是这段代码没有保存到我的数据库中,我没有任何错误!!!

               HttpRequestLog.objects.create(**params)

我的代码在 api 返回 200 或 204 或 201 状态时工作。

【问题讨论】:

  • 404 通常由 异常 而非 HTTP 响应完成,因此您需要“捕获”错误、记录响应并重新引发它。跨度>
  • 我将它写入 process_exception 但不起作用!
  • @Sifb71 从您的设置中显示MIDDLEWARE 设置。
  • @Abdul Aziz Barkat MIDDLEWARE = [... myapp.middleware.request_log_middleware.TestMiddleware ... ]
  • 我的中间件工作了,但是当 404 accur..in 200 或 500 工作时,我无法将任何内容保存到数据库中!

标签: django middleware django-2.2


【解决方案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】:

    我终于找到了解决问题的办法!

    我在我的代码中使用了一个修订中间件,我改变了我的中间件排序并将我的中间件放在修订中间件之上,一切都成功了!

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      相关资源
      最近更新 更多