2011-02-07 23 views
11

Durante el desarrollo, estoy ejecutando Django en el modo de depuración y estoy publicando datos en mi aplicación mediante una aplicación de modo de texto. Idealmente, necesito recibir una respuesta de texto sin formato cuando obtengo un código de error http 500, así no tengo que buscar el error real dentro de todo ese HTML y Javascript.Cómo obtener un texto sin formato Django página de error

¿Es posible obtener un error interno del servidor Django 500 como texto sin formato?

Respuesta

7

pienso escribir un middleware, porque de lo contrario la excepción no está disponible en el 500.html

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

class ProcessExceptionMiddleware(object): 
    def process_exception(self, request, exception): 
     t = Template("500 Error: {{ exception }}") 
     response_html = t.render(Context({'exception' : exception })) 

     response = http.HttpResponse(response_html) 
     response.status_code = 500 
     return response 
+0

Esto funciona, gracias. El problema ahora es acceder al seguimiento de la pila, porque "excepción" es solo un objeto de Excepción regular. – simao

+0

¡Felicitaciones! Mire en 'sys.exc_info()' para obtener acceso al traceback. Sugiero mirar directamente el código de django que hace el formateo de traceback normalmente en 'django.core.handlers.base' para implementar su propia versión. –

+0

Sí, eso funciona. Gracias. – simao

9

Hay un ajuste de DEBUG_PROPAGATE_EXCEPTIONS lo que obligará a Django no envolver las excepciones, para que pueda verlos, por ejemplo en los registros de devserver.

1

Esta es una mejora en la respuesta de Yuji, que proporciona una stacktrace, más instrucciones (para nosotros los django novatos) y es más simple.

Ponga este código en un archivo en algún lugar de su aplicación, p. PROJECT_ROOT/MAIN_APP/middleware/exceptions.py, y asegúrese de tener un __init__.py vacío en el mismo directorio.

import traceback 
from django.http import HttpResponse 

class PlainExceptionsMiddleware(object): 
    def process_exception(self, request, exception): 
     return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500) 

Ahora editar su settings.py y encontrar MIDDLEWARE_CLASSES = (. Agregue otra entrada para que sea así:

MIDDLEWARE_CLASSES = (
    # (all the previous entries) 

    # Plain text exception pages. 
    'MAIN_APP.middleware.exceptions.PlainExceptionsMiddleware', 
) 

¡Reinicie django y listo!

Formateo compatible con el agente de usuario.

Si es como yo y está desarrollando una aplicación y un sitio web respaldados por django, es probable que desee mostrar páginas de error de texto sin formato a la aplicación y las más agradables al navegador. Una forma sencilla de a que es comprobar el agente de usuario:

import traceback 
from django.http import HttpResponse 

class PlainExceptionsMiddleware(object): 
    def process_exception(self, request, exception): 
     if "HTTP_USER_AGENT" in request.META and "chrome" in request.META["HTTP_USER_AGENT"].lower(): 
      return 
     return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500) 
14

Si usted está buscando una manera de obtener una página de error de texto plano cuando se utiliza curl, que necesidad de añadir la cabecera HTTP X-Requested-With con valor XMLHttpRequest , p.ej

curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/ 

Explicación: esto se debe a Django usa el método is_ajax para determinar si es o no regresar como texto plano o HTML. is_ajax a su vez mira X-Requested-With.

Cuestiones relacionadas