【问题标题】:Getting rid of Django IOErrors摆脱 Django IOErrors
【发布时间】:2011-01-23 11:22:33
【问题描述】:

我正在运行一个 Django 站点(通过 Apache/mod_python),我使用 Django 的工具来通知我和其他开发人员有关内部服务器错误的信息。有时会出现这样的错误:

Traceback (most recent call last):

  File "/opt/webapp/externals/lib/django/core/handlers/base.py", line 92, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/opt/webapp/csite/apps/customers/views.py", line 29, in feedback
    form = FeedbackForm(request.POST)

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 113, in _get_post
    self._load_post_and_files()

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 96, in _load_post_and_files
    self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()

  File "/opt/webapp/externals/lib/django/core/handlers/modpython.py", line 163, in _get_raw_post_data
    self._raw_post_data = self._req.read()

IOError: Client read error (Timeout?)

据我所知,那些IOErrors 是由在错误时刻断开连接的客户端生成的,这不是我网站的问题。

如果是这种情况:我可以以某种方式禁用这些错误的电子邮件吗?我真的不想知道那些我无法修复且不是真正错误的错误。

【问题讨论】:

    标签: python django logging


    【解决方案1】:

    您应该能够编写一个中间件来捕获异常,然后您可以“静默”那些特定的异常。

    https://docs.djangoproject.com/en/2.2/topics/http/middleware/

    【讨论】:

    • 这适用于视图函数内部发生的 IOErrors。对于视图函数之外的 IOErrors,您可以做什么?例如当将响应流式传输回客户端时,例如返回 HttpResponse(open('large_text_file.txt'))
    • 用更新的 django 文档链接更新这篇文章。 docs.djangoproject.com/en/1.10/topics/http/middleware/…
    【解决方案2】:

    在 django 1.3 及更高版本中,您可以使用 logging filter 类来抑制您不感兴趣的异常。这是我用来严格抑制从 _get_raw_post_data() 引发的 IOError 异常的日志过滤器类:

    import sys, traceback
    class _SuppressUnreadablePost(object):
        def filter(self, record):
            _, exception, tb = sys.exc_info()
            if isinstance(exception, IOError):
                for _, _, function, _ in traceback.extract_tb(tb):
                    if function == '_get_raw_post_data':
                        return False
            return True
    

    在 Django 1.4 中,您将能够消除大部分复杂性并抑制新的异常类 UnreadablePostError。 (见this patch)。

    【讨论】:

      【解决方案3】:

      通过@dlowe 为 Django 1.3 扩展解决方案,我们可以将完整的工作示例编写为:

      settings.py

      LOGGING = {
          'version': 1,
          'disable_existing_loggers': False,
          'filters': {
              'supress_unreadable_post': {
                  '()': 'common.logging.SuppressUnreadablePost',
              }
          },
          'handlers': {
              'mail_admins': {
                  'level': 'ERROR',
                  'class': 'django.utils.log.AdminEmailHandler',
                  'filters': ['supress_unreadable_post'],
              }
          },
          'loggers': {
              'django.request': {
                  'handlers': ['mail_admins'],
                  'level': 'ERROR',
                  'propagate': True,
              },
          }
      }
      

      common/logging.py

      import sys, traceback
      
      class SuppressUnreadablePost(object):
          def filter(self, record):
              _, exception, tb = sys.exc_info()
              if isinstance(exception, IOError):
                  for _, _, function, _ in traceback.extract_tb(tb):
                      if function == '_get_raw_post_data':
                          return False
              return True
      

      【讨论】:

      • 这对我不起作用。但!原来问题是我使用了哨兵和乌鸦,后者为 get_request_exception 信号注册了一个处理程序。这条路径只是跳过了 python 日志记录(因此是过滤器),并直接写入哨兵......
      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 2010-11-03
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 2012-03-02
      相关资源
      最近更新 更多