2010-03-03 12 views
7

मैं एक Django साइट (अपाचे/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 रों ग्राहकों कि गलत पल में डिस्कनेक्ट द्वारा उत्पन्न कर रहे हैं और यह मेरी साइट के एक समस्या नहीं है कि।

यदि ऐसा है: क्या मैं किसी भी तरह से उन त्रुटियों के लिए ईमेल अक्षम कर सकता हूं? मैं वास्तव में त्रुटियों के बारे में जानना नहीं चाहता हूं जिन्हें मैं ठीक नहीं कर सकता और वास्तव में त्रुटियां नहीं हैं।

उत्तर

2

आप अपवाद को पकड़ने के लिए मिडलवेयर लिखने में सक्षम होना चाहिए और फिर आप उन विशिष्ट अपवादों को "चुप्पी" कर सकते हैं।

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

+1

हो जाएगा ताकि IOErrors के लिए काम जो दृश्य कार्यों के अंदर होते हैं। IOErrors के दृश्य कार्य के बाहर आप क्या कर सकते हैं? जैसे क्लाइंट को प्रतिक्रिया वापस स्ट्रीम करते समय उदा। वापसी HttpResponse (खुला ('big_text_file.txt')) – Eloff

+0

अद्यतन django प्रलेखन लिंक के साथ इस पोस्ट को अद्यतन कर रहा है। https://docs.djangoproject.com/en/1.10/topics/http/middleware/#process-exception – lyncas

2

Django 1.3 में और ऊपर, आप अपवाद है जो आप में कोई दिलचस्पी नहीं कर रहे हैं को दबाने के लिए एक logging filter वर्ग का उपयोग कर सकते हैं। यहाँ प्रवेश फिल्टर वर्ग मैं बाल बाल _get_raw_post_data() से उठाया IOError अपवादों को दबाने के लिए उपयोग कर रहा हूँ है :

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

Django 1.3 के लिए @dlowe से समाधान का विस्तार, हम पूर्ण काम कर उदाहरण के रूप में लिख सकते हैं:

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 सिग्नल में एक हैंडलर पंजीकृत किया। इस पथ ने सिर्फ अजगर लॉगिंग (इस प्रकार फ़िल्टर) छोड़ा, और सीधे प्रेषित को लिखा ... –

संबंधित मुद्दे