2009-12-18 3 views
9

Он работает под управлением DEBUG = True. Иногда он может выбросить сообщение об ошибке с информацией отладочной при возникновении ошибок, но иногда он просто отображает следующие строки:Django Unhandled Exception

Unhandled Exception 

An unhandled exception was thrown by the application. 

я должен перейти на сервер разработки, чтобы увидеть детали сообщения.

Как я могу заставить его всегда отображать сообщение трассировки при возникновении ошибки?

+0

Таким образом, отображение ошибки несовместимо, есть ли какой-либо шаблон, который показывает ошибки, а какие нет? –

+0

Как вы обслуживаете сайт? Вы говорите ниже Nginx, но это FastCGI? –

ответ

6

Может быть, вы можете использовать этот фрагмент кода, это будет регистрировать исключения в журнале Апача:

utils.py:

def log_traceback(exception, args): 
    import sys, traceback, logging 
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() 
    logging.debug(exception) 
    logging.debug(args) 
    for tb in traceback.format_exception(exceptionType, exceptionValue, exceptionTraceback): 
     logging.debug(tb) 

site_logging.py:

import logging 
import sys 

logger = logging.getLogger('') 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler(sys.stderr) 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(levelname)-8s %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 

положить его в settings.py:

import site_logging 

И в вашем коде:

from where.is.your.utils import log_traceback 
try: 
    `do something` 
except Exception, args: 
    log_traceback(Exception, args) 
1

Это то, что DEBUG = True предназначено для: полного отображения трасс. Идея состоит в том, что обычные пользователи не хотят (и не хотят, чтобы они) видели что-то, кроме простого сообщения об ошибке.

+0

Существуют определенные ошибки, возникающие вне обработки 500-debug-page, где вы по-прежнему получаете необработанную ошибку с веб-сервера. –

+0

Да, я тоже заметил, что иногда я получаю страницы ошибок mod_python, а не страницу Django. – JAL

3

Вы используете Apache?
Просто из интереса это ваша среда производства или Dev, где вы хотите увидеть трассировку?

DJango Book on security - Exposed error messages От

пользователей развертывание под Apache и mod_python также должны убедиться, что они имеют PythonDebug Off в своих конф файлов Apache; это гарантирует, что любые ошибки, которые произошли до того, как Django имел возможность загрузить, не будут отображаться публично.

Я предполагаю, что вы хотите PythonDebug On, это рекомендуется только для разработки.

+0

@Ralph, я использую Nginx. – jack

+0

Я использую mod_python с PythonDebug Off, и я все же могу переключить DEBUG = True в своих настройках, чтобы быстро устранить проблему. Он по-прежнему дает мне удобную страницу отладки django вместо страницы ошибки сервера внутреннего сервера apache. –

+0

Извините, Джек, не использовал Nginx, так что, возможно, кто-то с Nginx может помочь справиться с проблемой стрельбы. Брэндон - может ли это быть Nginx? –

9

Просто подключите к сигналу got_request_exception и войти исключение:

from django.core.signals import got_request_exception 
import logging  

def log(*args, **kwargs): 
    logging.exception('error') 

got_request_exception.connect(log) 

Это будет регистрировать весь след. На сервере dev он входит в консоль.

Смежные вопросы