2012-03-27 20 views
5

Tarea: Cuando se produce un error en uno de mis puntos de vista que necesito para mostrar una vista personalizada de error. El tipo de error no importa.Pirámide (Python): vista de error por defecto de anulación

Me trataron de anular todas las excepciones por registring una vista para todas las excepciones, así:

<view 
    context="Exception" 
    renderer="server_error.pt" 
    /> 

Se trabajó buena. Todas las excepciones mostraban mi punto de vista. Pero el problema era que esos errores dejaron de registrar. De cource puedo hacer algo como logger.error (traceback) en mi vista de error, pero esta es una idea tonta.

¿Cómo puedo registrar una vista para todos los errores sin romper el sistema de registro de la pirámide.

+0

Debe registrar el error usted mismo o volver a generar el error. Si resubes el error, se registrará pero no renderizará tu vista. Si registra el error dentro de su vista, se registrará y mostrará su vista. –

Respuesta

2

Puede registrar el error en su opinión a través de la llanura tala pitón de edad. O establezca el estado en la respuesta a 500 (suponiendo que su vista ahora devuelva un estado de 200 que indica una respuesta exitosa).

Editar: ejemplo de trabajo

No soy un experto en la explotación forestal, pero yo tenía la impresión de que su configuración de registro en development.ini/production.ini sería recogido, el ejemplo de abajo parece probar que pero es que el juez .....

cambios de configuración para iniciar sesión de forma predeterminada

[formatter_generic] 
# format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s 
format = y u no work??!!?? %(message)s 
# End logging configuration 

las vistas

from pyramid.view import view_config 
from webob import Response 
import logging 
log = logging.getLogger(__name__) 

@view_config(route_name='home', renderer='templates/mytemplate.pt') 
def my_view(request): 
    raise ValueError("oops") 
    return {'project':'tstLogError'} 


@view_config(context=Exception) 
def exception_view(context, request): 
    log.error("The error was: %s" % context, exc_info=(context)) 
    return Response(status_int=500, body=str(context)) 

    from pyramid.view import view_config 
    from webob import Response 
salida

consola:

serving on http://0.0.0.0:6543 
y u no work??!!?? The error was: oops 
Traceback (most recent call last): 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/tweens.py", line 20, in excview_tween 
    response = handler(request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/router.py", line 164, in handle_request 
    response = view_callable(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 333, in rendered_view 
    result = view(context, request) 
    File "/home/twillis/projects/TestLogError/local/lib/python2.7/site-packages/pyramid/config/views.py", line 471, in _requestonly_view 
    response = view(request) 
    File "/home/twillis/projects/TestLogError/tstLogError/tstlogerror/views.py", line 8, in my_view 
    raise ValueError("oops") 
ValueError: oops 

browser screenshot

+0

Como he dicho: el registro con el registrador base es una mala solución. Si hago eso, no puedo registrarlo con la configuración de la pirámide. Probé la configuración del código de estado, pero no cambió la situación de registro (todavía no hay error). –

+0

entonces, ¿qué dices es cuando aciertas esa vista con tu navegador, tu navegador ve HTTP_STATUS = 500 pero no está siendo registrado? Eso es sorprendente. Id tengo que verlo para creerlo. –

+0

Dou! En tu ejemplo, lo registras tú mismo :). se muestra con 'y u no work ?? !! ??' es porque ha cambiado la configuración del formateador, que se aplica en todos los resultados al sys.error. ¡Pero aún así gracias! Ahora entiendo que no hay otra manera que registrarlo usted mismo y se aplica el formateador, por lo que parece no ser un problema –

2

No es tonto para registrar la excepción en su propio punto de vista de error (. excepción estará disponible como request.context) Como es siempre el caso con excepciones, no puede hacer nada, manejar la excepción e iniciar sesión, o volver a generar la misma excepción.

En mi configuración, una excepción no capturada se registra por el propio servidor WSGI, en este caso wsgiref. No es posible activar el mecanismo de respuesta normal del servidor WSGI y su registrador de excepciones. registrador excepción

de wsgiref:

def log_exception(self,exc_info): 
    """Log the 'exc_info' tuple in the server log 

    Subclasses may override to retarget the output or change its format. 
    """ 
    try: 
     from traceback import print_exception 
     stderr = self.get_stderr() 
     print_exception(
      exc_info[0], exc_info[1], exc_info[2], 
      self.traceback_limit, stderr 
     ) 
     stderr.flush() 
    finally: 
     exc_info = None 

Una alternativa que puede ser aceptable para ti es para mostrar su página de error personalizada en el nivel de servidor web en lugar de en el nivel de la pirámide.

+0

Gracias por la respuesta. Parece que simplemente lo registraré dentro de la vista. –

0

El plugin pyramid_exclog llena este propósito muy bien.

Se implementa como una interpolación para que pueda escribir una vista para Exception y registrará los detalles de la excepción en cualquier controlador de registro que especifique en su archivo de configuración de pirámide - clima que es para la consola, un archivo o un correo electrónico

Además de la documentación pyramid_exclog, también encontré la sección Python Configuration file format de la documentación de Python muy útil ya que la configuración es bastante complicada de hacer bien.

Cuestiones relacionadas