El libro de Django 1.0

19.8. Exposición de mensajes de error

Mientras se desarrolla, tener la posibilidad de ver tracebacks y errores en vivo en tu navegador es extremadamente útil. Django posee mensajes de depuración "vistosos" e informativos específicamente para hacer la tarea de depuración más fácil.

Sin embargo, si esos errores son visualizados una vez que el sitio pasa a producción, pueden revelar aspectos de tu código o configuración que podrían ser de utilidad a un atacante.

Es más, los errores y tracebacks no son para nada útiles para los usuarios finales. La filosofía de Django es que los visitantes al sitio nunca deben ver mensajes de error relacionados a una aplicación. Si tu código genera una excepción no tratada, un visitante al sitio no debería ver un traceback completo — ni ninguna pista de fragmentos de código o mensajes de error (destinados a programadores) de Python. En cambio, el visitante debería ver un amistoso mensaje "Esta página no está disponible".

Naturalmente, por supuesto, los desarrolladores necesitan ver tracebacks para depurar problemas en su código. Así que el framework debería ocultar todos los mensajes de error al público pero debería mostrarlos a los desarrolladores del sitio.

19.8.1. La solución

Django tiene un sencillo control que gobierna la visualización de esos mensajes de error. Si se fija la variable de configuración DEBUG al valor True, los mensajes de error serán visualizados en el navegador. De otra forma, Django retornará un mensaje HTTP 500 ("Error interno del servidor") y renderizará una plantilla de error provista por ti. Esta plantilla de error tiene el nombre 500.html y debe estar situada en la raíz de uno de tus directorios de plantillas.

Dado que los desarrolladores aun necesitan ver los errores que se generan en un sitio en producción, todos los errores que se manejen de esta manera dispararán el envío de un email con el traceback completo a las direcciones de correo configuradas en la variable ADMINS.

Los usuarios que implementen en conjunto con Apache y mod_python deben también asegurarse que tienen PythonDebug Off en sus archivos de configuración de Apache; esto suprimirá cualquier error que pudiera ocurrir aun antes de que Django se haya cargado.