Избавляемся от Django IOErrors - PullRequest
7 голосов
/ 04 марта 2010

Я управляю сайтом 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?)

Насколько я узнал, эти IOError генерируются клиентами, которые отключаются в неподходящий момент и что это не проблема моего сайта.

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

Ответы [ 3 ]

11 голосов
/ 23 апреля 2012

Расширяя решение @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,
        },
    }
}

общий / 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
2 голосов
/ 11 февраля 2012

В django 1.3 и выше вы можете использовать класс logging filter для подавления исключений, которые вас не интересуют. Вот класс фильтра logging, который я использую для узкого подавления исключений IOError, поднятых из _get_raw_post_data()

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. (См. этот патч ).

2 голосов
/ 04 марта 2010

Вы должны быть в состоянии написать Middleware, чтобы перехватить исключение, и затем вы можете "замолчать" эти конкретные исключения.

http://docs.djangoproject.com/en/1.1/topics/http/middleware/#process-exception

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...