2010-03-03 26 views
7

Estoy ejecutando un sitio de Django (a través de Apache/mod_python) y uso las instalaciones de Django para informarnos a mí y a otros desarrolladores sobre los errores internos del servidor. A veces los errores como los que aparecen:Deshacerse de 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?) 

Por lo que yo descubrí, esos IOError s son generados por los clientes que desconectan en el momento equivocado y que no es un problema de mi sitio web.

Si ese es el caso: ¿Puedo desactivar los correos electrónicos para esos errores de alguna manera? Realmente no quiero saber acerca de los errores que no puedo solucionar y que no son realmente errores.

Respuesta

2

Debería poder escribir un Middleware para detectar la excepción y luego puede "silenciar" esas excepciones específicas.

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

+1

Esta voluntad trabajo para IOErrors que ocurren dentro de las funciones de visualización. ¿Qué puedes hacer por la función IOErrors outside of view? p.ej. al transmitir una respuesta al cliente, p. return HttpResponse (open ('large_text_file.txt')) – Eloff

+0

actualizando esta publicación con los enlaces actualizados de documentación de django. https://docs.djangoproject.com/en/1.10/topics/http/middleware/#process-exception – lyncas

2

En Django 1.3 y arriba, se puede utilizar una clase logging filter para suprimir las excepciones que usted no está interesado. Aquí está la clase de filtro de registro que estoy usando para suprimir el estrecho margen excepciones ioError recaudados de _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 

En Django 1.4, usted será capaz de acabar con la mayor parte de la complejidad y suprimir la nueva clase de excepción UnreadablePostError. (Ver this patch).

11

La extensión de la solución por @dlowe de Django 1.3, podemos escribir el ejemplo de trabajo completo como:

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, 
     }, 
    } 
} 

común/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

Esto no funcionó para mí. ¡PERO! Resultó que el problema era que yo usaba centinela y cuervo, y este último registraba un controlador para la señal get_request_exception. Esta ruta simplemente saltó el registro de Python (por lo tanto, el filtro) y escribió directamente al centinela ... –