Подавление Django mod_wsgi IOErrors - PullRequest
       6

Подавление Django mod_wsgi IOErrors

1 голос
/ 22 февраля 2012

Эти ошибки ввода-вывода довольно хорошо известны, как видно из других потоков SO (см. Ниже), и могут быть вызваны тем, что пользователь закрывает браузер во время загрузки. Для обсуждения того, почему не существует простого решения, см. эту ветку django-developers .

Сначала я попробовал опцию промежуточного программного обеспечения, описанную в ответе на этот поток ioerror SO (за исключением нашего случая, я бы выполнил ответ на запрос uri). Это не сработало : я мог зафиксировать ответ и увидеть, что в отношении Django не было файла, включенного в сообщение, и он возвращал ответ 200 с ошибкой проверки. И все же , я все еще вижу IOError в журнале ошибок Apache.

Затем мы нашли это обсуждение ошибки django , которая предлагает вам подавить это с помощью фильтра Logging . Я попытался прикрепить фильтр к нашему настраиваемому регистратору, корневому регистратору и django.request ... Я все еще не могу увидеть IOError, чтобы подавить его! Я вижу только сообщения журнала, связанные с неудачной проверкой формы.

Есть предложения?

[Редактировать: вот мои настройки]

В settings.py (в основном, скопировано с Django's conf/global_settings.py):

DEBUG = False

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'ioerrsquash': {
            '()': 'es.ioerr_filter.IOErrorFilter'
        }    },
    'handlers': {
            'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['ioerrsquash']
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'wsgi.errors': { # added this logger after django.request failed
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
       }
    }
}

Содержимое ioerr_filter.py (очевидно, только для целей тестирования):

import logging
import sys
from django.conf import settings

class IOErrorFilter(logging.Filter):
    def filter(self, record):
        LOGF = "%s/BU_IOERR.log" % settings.LOG_FILE_DIR
        f = open(LOGF, 'a')
        f.write('... record\n')
        f.write(str(record))
        f.write('\n... exc_info\n')
        f.write(str(sys.exc_info()))
        f.write('\n...\n')
        return True

1 Ответ

0 голосов
/ 22 февраля 2012

Есть более недавние проблемы, когда это теперь поднимается как UnreadablePostError на транке / 1.4beta. См. https://code.djangoproject.com/ticket/17277 и https://code.djangoproject.com/ticket/17069.. Вы должны иметь возможность использовать фильтр регистрации для подавления этих ошибок. В # 17069 есть пример.

...