2010-03-03 10 views
7

Ich betreibe eine Django-Site (über Apache/mod_python) und nutze Djangos Möglichkeiten, um mich und andere Entwickler über interne Serverfehler zu informieren. Manchmal Fehler wie diejenigen erscheinen:Ich entferne 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?) 

Soweit ich herausgefunden hat, diese IOError s von Kunden erzeugt werden, die im falschen Moment zu trennen, und dass es kein Problem von meiner Seite.

Wenn das der Fall ist: Kann ich die E-Mails für diese Fehler irgendwie deaktivieren? Ich möchte wirklich nichts über Fehler wissen, die ich nicht beheben kann und die nicht wirklich Fehler sind.

Antwort

2

Sie sollten in der Lage sein, eine Middleware zu schreiben, um die Ausnahme abzufangen, und Sie können dann diese spezifischen Ausnahmen "zum Schweigen bringen".

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

+1

Dieser Wille arbeiten für IOErrors, die innerhalb von View-Funktionen auftreten. Was können Sie für IOErrors außerhalb der Ansichtsfunktion tun? z.B. wenn eine Antwort an den Client zurückgesendet wird, z. return HttpResponse (open ('large_text_file.txt')) – Eloff

+0

Aktualisierung dieses Posts mit aktualisierten django-Dokumentationslinks. https://docs.djangoproject.com/de/1.10/topics/http/middleware/#process-exception – lyncas

2

In django 1.3 und höher können Sie eine logging filter Klasse verwenden, um die Ausnahmen zu unterdrücken, die Sie nicht interessiert sind. Hier ist die Protokollierung der Filterklasse verwende ich von _get_raw_post_data() angehoben IOError Ausnahmen eng zu unterdrücken :

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 

In Django 1.4, können Sie weg von der Komplexität mit den meisten zu tun, und die neuen Ausnahmeklasse UnreadablePostError unterdrücken. (Siehe this patch).

11

die Lösung von @dlowe für Django Erweiterung 1.3 können wir die volle Arbeitsbeispiel, wie schreiben:

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 
+1

Das war nicht für mich arbeiten. ABER! Es stellte sich heraus, dass ich Sentry und Raven verwendet habe, und letzterer einen Handler für das Signal get_request_exception registriert hat. Dieser Pfad übersprang einfach die Python-Protokollierung (also den Filter) und schrieb direkt an die Wache ... –

Verwandte Themen