2012-03-22 8 views
16

tengo una vista personalizada 404 definida en mi Pirámide aplicación:Pirámide: Custom página 404 regresa como "200 OK"

@view_config(context=HTTPNotFound, renderer='404.pt') 
def not_found(self, request): 
    return {} 

Funciona bien, excepto que el código de estado HTTP enviado con el contenido es 200 OK , lo cual no está bien de ninguna manera. Estoy teniendo el mismo problema con 403 Forbidden. ¿Cómo puedo hacer que Pyramid envíe el código de estado correcto?

Respuesta

19

la vista excepción es una vista separada que proporciona un punto de fo Usted puede hacer lo que quiera. Al igual que cualquier vista que use un renderizador, puede afectar el objeto de respuesta a través del request.response para modificar su comportamiento. El procesador luego llena el cuerpo.

@view_config(context=HTTPNotFound, renderer='404.pt') 
def not_found(self, request): 
    request.response.status = 404 
    return {} 
+2

Perfecto Sin embargo, una corrección: el estado debería ser '404 No encontrado'. De los documentos de Pyramid: "response.status: el código de respuesta más el mensaje de motivo, como '200 OK'. Para configurar el código sin un mensaje, use status_int , es decir: response.status_int = 200. " –

+3

Si Como un número entero, buscará el estado en su tabla de búsqueda interna y completará la cadena por usted. Es una arruga de conveniencia que probablemente debería documentarse mejor. –

0

La mejor manera de hacer esto es para anular la vista por defecto no encontrado:

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/hooks.html#changing-the-not-found-view

Incluso en este escenario, es necesario devolver un objeto respuesta adecuada que tiene el estado 404:

def notfound(request): 
    return Response('Not Found, dude', status='404 Not Found') 

para tomar el ejemplo de la página vinculado anteriormente

+0

Pero eso no me dejó usar una plantilla camaleón ... :( –

+0

puede o bien, hacer que la plantilla usted mismo, o, creo que el procesador de camaleón le permitirá devolver un objeto Respuesta y luego procese el cuerpo a través de la plantilla, entonces, si hace lo que publicó anteriormente, pero luego devuelve Response (estado = '404 no encontrado'), creo que representará un dict vacío a través de camaleón con el código de respuesta correcto – turtlebender

6

En realidad, en la pirámide 1.3 Hay un nuevo @notfound_view_config decorador.

@notfound_view_config(renderer = '404_error.jinja2') 
def notfound(request): 
    request.response.status = 404 
0

Así es como puede usar directamente el gancho 404 y representar una plantilla mientras lo hace.

En su init .py:

config.add_notfound_view(not_found) 

En su view.py:

from pyramid.view import notfound_view_config 
from pyramid.renderers import render_to_response 

def not_found(request): 
    request.response.status = 404 
    t = 'talk_python_to_me_com:templates/errors/404.pt' 
    return render_to_response(t, {}, request) 

Hice esto por Talk Python a mí: http://www.talkpythontome.com/, aquí está una página no válida para ver una plantilla personalizada representada.

http://www.talkpythontome.com/there_is_no_cat

Cuestiones relacionadas