2010-03-03 49 views
7

我正在運行一個Django站點(通過Apache/mod_python),我使用Django的工具來通知我和其他開發人員關於內部服務器錯誤。有時候,像那些出現錯誤:擺脫Django IO錯誤

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做什麼?例如當將響應流送回客戶端時,例如返回HttpResponse(open('large_text_file.txt')) – Eloff 2011-10-13 21:46:57

+0

用更新的django文檔鏈接更新這篇文章。 https://docs.djangoproject.com/en/1.10/topics/http/middleware/#process-exception – lyncas 2016-12-30 21:29:23

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

通過擴展的@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日誌記錄(因此過濾器),並直接寫入哨兵... – 2013-12-27 15:00:42