2010-03-03 2 views
7

Я запускаю сайт Django (через Apache/mod_python), и я использую возможности Django, чтобы сообщить мне и другим разработчикам о внутренних ошибках сервера. Иногда ошибки, как те появляются:Избавление от Django IOErrors

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 s генерируются клиентами, которые отключают в самый неподходящий момент, и что это не проблема моего сайта.

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

ответ

2

Вы должны иметь возможность написать промежуточное программное обеспечение, чтобы поймать исключение, и затем вы можете «отключить» эти конкретные исключения.

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

+1

Это будет работа для IOErrors, которые происходят внутри функций просмотра. Что вы можете сделать для функции IOErrors вне функции просмотра? например при потоковой передаче ответа обратно клиенту, например. return HttpResponse (open ('large_text_file.txt')) – Eloff

+0

Обновление этого сообщения с обновленными ссылками документации django. https://docs.djangoproject.com/en/1.10/topics/http/middleware/#process-exception – lyncas

2

В Джанго 1.3 и выше, вы можете использовать logging filter класс для подавления исключений, которые вы не заинтересованы. Вот класс фильтра журнала я использую узко подавить 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. (См. this patch).

11

Расширение решения по @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 
+1

Это не работало для меня. НО! Оказалось, проблема заключалась в том, что я использовал часовой и ворон, и последний зарегистрировал обработчик сигнала get_request_exception. Этот путь просто пропустил ведение журнала python (таким образом, фильтр) и написал непосредственно часовому ... –

Смежные вопросы