Pregunta

Estoy corriendo Django 1.0 y estoy cerca de implementar mi aplicación.Como tal, cambiaré la configuración DEBUG a Falso.

Dicho esto, todavía me gustaría incluir el seguimiento de pila en mi página 500.html cuando se produzcan errores.Al hacerlo, los usuarios pueden copiar y pegar los errores y enviarlos por correo electrónico fácilmente a los desarrolladores.

¿Alguna idea sobre la mejor manera de abordar este tema?

¿Fue útil?

Solución

Registre automáticamente sus 500, de esa manera:

  • Sabes cuando ocurren.
  • No necesita depender de que los usuarios le envíen seguimientos de pila.

Joel recomienda incluso ir tan lejos como crear tickets automáticamente en su rastreador de errores cuando su aplicación experimenta una falla.Personalmente, creo una fuente RSS (privada) con stacktraces, URL, etc.al que los desarrolladores pueden suscribirse.

Por otro lado, mostrar seguimientos de pila a sus usuarios podría filtrar información que usuarios malintencionados podrían utilizar para atacar su sitio.Los mensajes de error demasiado detallados son uno de los trampolines clásicos para los ataques de inyección SQL.

Editar (muestra de código agregada para capturar el rastreo):

Puede obtener la información de la excepción de la llamada sys.exc_info.Mientras que el formato del rastreo para su visualización proviene del módulo de rastreo:

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))

Huellas dactilares:

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

Otros consejos

Como dice @zacherates, realmente no desea mostrar un seguimiento de pila a sus usuarios.El enfoque más sencillo para este problema es lo que Django hace de forma predeterminada si usted y sus desarrolladores figuran en la configuración ADMINS con direcciones de correo electrónico;envía un correo electrónico a todos en esa lista con el seguimiento de la pila completa (y más) cada vez que hay un error 500 con DEBUG = False.

Si queremos mostrar las excepciones que se generan en nuestra plantilla (500.html), entonces podríamos escribir su propia vista 500, tomar la excepción y pasarla a su plantilla 500.

Pasos:

# En vistas.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))))

# En URL principales.py:

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

# En plantilla (500.html):

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

más sobre esto aquí: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

podrías llamar sys.exc_info() en un controlador de excepciones personalizado.Pero no lo recomiendo.Django puede enviarle correos electrónicos para excepciones.

Sé que esta es una vieja pregunta, pero hoy en día recomendaría utilizar un servicio como Centinela para capturar sus errores.

En Django, los pasos para configurar esto son increíblemente simples.De los documentos:

  • Instale Raven usando pip install raven
  • Agregar 'raven.contrib.django.raven_compat' para usted settings.INSTALLED_APPS.
  • Agregar RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN} a su configuración.

Luego, en su página 500 (definida en handler500), pasa el request.sentry.id a la plantilla y sus usuarios pueden hacer referencia al error específico sin que ninguno de sus componentes internos quede expuesto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top