2009-12-18 26 views
9

È in esecuzione in DEBUG = modalità True. A volte può buttare fuori un messaggio di errore con le informazioni traceback quando si verifichi un errore, ma a volte basta visualizzare le seguenti linee:Eccezione Django non gestita

Unhandled Exception 

An unhandled exception was thrown by the application. 

devo passare a server di sviluppo per vedere il messaggio particolare.

Come posso farlo visualizzare sempre il messaggio di traceback quando si verifica un errore?

+0

Quindi la visualizzazione dell'errore non è coerente, c'è qualche schema in relazione a quali errori vengono mostrati e quali no? –

+0

Come stai servendo il sito? Dici sotto Nginx, ma è FastCGI? –

risposta

6

forse è possibile utilizzare questo frammento, questo registrerà eccezioni nel registro di apache:

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) 

metterlo in settings.py:

import site_logging 

E nel codice:

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

Ecco cosa DEBUG = Vero è per: mostrare il traceback completo. L'idea è che gli utenti normali non vogliono (né li vogliono) vedere qualcosa di diverso da un semplice messaggio di errore.

+0

Alcuni errori si verificano al di fuori della gestione di 500-debug-page, in cui si verifica ancora un errore non elaborato dal server web. –

+0

Sì, ho notato anche che a volte ottengo le pagine di errore mod_python piuttosto che la pagina Django. – JAL

3

Stai utilizzando Apache?
Solo per interesse è questo il tuo ambiente di produzione o sviluppo in cui vuoi vedere il traceback?

Dalle DJango Book on security - Exposed error messages

utenti la distribuzione sotto Apache e mod_python dovrebbe anche assicurarsi che essi hanno PythonDebug Off nel loro file conf Apache; questo assicurerà che eventuali errori che si verificano prima che Django abbia avuto la possibilità di caricare non verranno visualizzati pubblicamente.

Presumo che si desideri PythonDebug On, questo è consigliato solo per lo sviluppo.

+0

@Ralph, sto usando Nginx. – jack

+0

sto usando mod_python con PythonDebug Off e posso ancora passare DEBUG = True nelle mie impostazioni per risolvere rapidamente un problema. Mi dà ancora la comoda pagina di debug di Django al posto della pagina di errore del server interno di 500 di Apache. –

+0

scusa Jack, non ho usato Nginx, quindi forse qualcuno con Nginx potrebbe essere in grado di aiutare a sparare. Brandon - potrebbe essere un Nginx specifico? –

9

basta collegarsi al segnale got_request_exception e Log eccezione:

from django.core.signals import got_request_exception 
import logging  

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

got_request_exception.connect(log) 

Questo registrerà l'intera traccia. Nel server di sviluppo, accede alla console.

Problemi correlati