2010-03-03 6 views
7

J'utilise un site Django (via Apache/mod_python) et j'utilise les fonctionnalités de Django pour m'informer, ainsi que d'autres développeurs, des erreurs internes du serveur. Parfois, des erreurs comme celles apparaissent:Se débarrasser 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?) 

Pour autant que j'ai découvert, ces IOError s sont générés par les clients qui se déconnectent au mauvais moment et que ce n'est pas un problème de mon site.

Si c'est le cas: Puis-je désactiver les courriels pour ces erreurs d'une manière ou d'une autre? Je ne veux vraiment pas savoir des erreurs que je ne peux pas corriger et qui ne sont pas vraiment des erreurs.

Répondre

2

Vous devriez être en mesure d'écrire un intergiciel pour intercepter l'exception et vous pouvez ensuite "faire taire" ces exceptions spécifiques.

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

+1

Cette volonté travailler pour IOErrors qui se produisent à l'intérieur des fonctions de vue. Que pouvez-vous faire pour IOErrors en dehors de la fonction de vue? par exemple. lors de la transmission en continu d'une réponse au client, par ex. return HttpResponse (open ('grand_text_file.txt')) – Eloff

+0

mise à jour de cet article avec des liens de documentation django mis à jour. https://docs.djangoproject.com/fr/1.10/topics/http/middleware/#process-exception – lyncas

2

Dans django 1.3 et, vous pouvez utiliser une classe logging filter pour supprimer les exceptions que vous n'êtes pas intéressé par. Voici la classe de filtre de journalisation j'utilise pour supprimer stricte des exceptions IOError soulevées 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 

Dans Django 1.4, vous serez en mesure de faire disparaître la majeure partie de la complexité et de supprimer la nouvelle classe d'exception UnreadablePostError. (Voir this patch).

11

L'extension de la solution par @dlowe pour Django 1.3, nous pouvons écrire l'exemple de travail plein:

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

commune/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

Cela ne fonctionnait pas pour moi. MAIS! Il s'est avéré que le problème était que j'utilisais sentinelle et corbeau, et que ce dernier enregistrait un gestionnaire au signal get_request_exception. Ce chemin a juste sauté la journalisation de python (donc le filtre), et a écrit directement à la sentinelle ... –

Questions connexes