Domanda

Sto eseguendo Django 1.0 e sto per implementare la mia app. Come tale, cambierò l'impostazione DEBUG su False.

Detto questo, vorrei comunque includere lo stacktrace sulla mia pagina 500.html quando si verificano errori. In questo modo, gli utenti possono copiare e incollare gli errori e inviarli facilmente tramite e-mail agli sviluppatori.

Qualche idea su come affrontare al meglio questo problema?

È stato utile?

Soluzione

Registra automaticamente i tuoi 500s, in questo modo:

  • Sai quando si verificano.
  • Non devi fare affidamento sugli utenti che ti inviano stacktraces.

Joel consiglia persino di creare automaticamente ticket nel tracker dei bug quando l'applicazione presenta un errore. Personalmente, creo un feed RSS (privato) con stacktraces, URL, ecc. A cui gli sviluppatori possono abbonarsi.

Mostrare tracce di stack ai tuoi utenti, d'altra parte, potrebbe eventualmente perdere informazioni che gli utenti malintenzionati potrebbero utilizzare per attaccare il tuo sito. I messaggi di errore troppo dettagliati sono uno dei classici trampolini di lancio per gli attacchi SQL injection.

Modifica (esempio di codice aggiunto per acquisire il traceback):

È possibile ottenere le informazioni sull'eccezione dalla chiamata sys.exc_info. Durante la formattazione del traceback per la visualizzazione proviene dal modulo traceback:

import traceback
import sys

try:
    raise Exception("Message")
except:
    type, value, tb = sys.exc_info()
    print >> sys.stderr,  type.__name__, ":", value
    print >> sys.stderr, '\n'.join(traceback.format_tb(tb))

Stampe:

Exception : Message
  File "exception.py", line 5, in <module>
    raise Exception("Message")

Altri suggerimenti

Come dice @zacherates, non vuoi davvero mostrare uno stacktrace ai tuoi utenti. L'approccio più semplice a questo problema è quello che Django fa di default se tu e i tuoi sviluppatori siete elencati nell'impostazione ADMINS con indirizzi e-mail; invia un'e-mail a tutti quelli in quell'elenco con la traccia dello stack completo (e altro) ogni volta che si verifica un errore 500 con DEBUG = False.

Se vogliamo mostrare le eccezioni che vengono generate, sul tuo modello (500.html), allora potremmo scrivere la tua vista 500, catturare l'eccezione e passarla al tuo modello 500.

Passi:

# In views.py:

import sys,traceback

def custom_500(request):
    t = loader.get_template('500.html')

    print sys.exc_info()
    type, value, tb = sys.exc_info()
    return HttpResponseServerError(t.render(Context({
        'exception_value': value,
        'value':type,
        'tb':traceback.format_exception(type, value, tb)
    },RequestContext(request))))

# In Main urls.py:

from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'

# Nel modello (500.html):

{{ exception_value }}{{value}}{{tb}}

ulteriori informazioni qui: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

Puoi chiamare sys.exc_info () in un gestore di eccezioni personalizzato. Ma non lo consiglio. Django può inviarti email per eccezioni.

So che questa è una vecchia domanda, ma in questi giorni consiglierei di utilizzare un servizio come Sentry a cattura i tuoi errori.

Su Django, i passaggi per configurarlo sono incredibilmente semplici. Da i documenti :

  • Installa Raven usando pip install raven
  • Aggiungi 'raven.contrib.django.raven_compat' alle tue settings.INSTALLED_APPS .
  • Aggiungi RAVEN_CONFIG = {" dsn " ;: YOUR_SENTRY_DSN} alle tue impostazioni.

Quindi, sulla tua pagina 500 (definita in handler500 ), passa il request.sentry.id al modello e i tuoi utenti possono fare riferimento all'errore specifico senza nessuno dei i tuoi interni sono esposti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top