Error personalizado de Django 404

Tengo una página 404.html, pero en algunos casos quiero poder enviar un mensaje de error json (para 404 y 500, etc.). Leí la siguiente página:

https://docs.djangoproject.com/en/dev/topics/http/views/#the-404-page-not-found-view

¿Hay algún tipo de ejemplo que muestre la implementación? Lo tengo en mi urls.py pero no se recupera en caso de error.

preguntado el 03 de julio de 12 a las 01:07

3 Respuestas

Esto funcionó para mí:

from django.conf.urls import patterns, include, url
from django.views.static import * 
from django.conf import settings
from django.conf.urls.defaults import handler404, handler500
from app.views import error

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'app.views.home', name='home'),
)

handler404 = error.error_handler
handler500 = error.error_handler

Puede hacer que haga lo que desee cuando vaya a ese controlador.

Respondido 03 Jul 12, 01:07

Además de la respuesta anterior, es importante decir que views.py debe devolver un HttpResponse con un estado 404 en el encabezado http. Es importante informar a los motores de búsqueda que la página actual es un 404. A veces, los spammers crean muchas URL que podrían parecer que lo llevarían a algún lugar, pero luego le brindan otro contenido. Con frecuencia hacen que muchas direcciones diferentes le sirvan casi exactamente el mismo contenido. Y debido a que no es fácil de usar, la mayoría de las guías de SEO lo penalizan. Entonces, si tiene muchas direcciones que muestran el mismo contenido pseudo-404, podría no verse bien para los sistemas de rastreo de los sitios web de búsqueda. Por eso, desea asegurarse de que la página que está sirviendo como un 404 personalizado tenga un estado 404. Así que aquí es una buena manera de ir:

En el urls.py de su aplicación agregue:

# Imports
from django.conf.urls.static import static
from django.conf.urls import handler404
from django.conf.urls import patterns, include, url
from yourapplication import views

##
# Handles the URLS calls
urlpatterns = patterns('',
    # url(r'^$', include('app.homepage.urls')),
)

handler404 = views.error404

En el archivo views.py de su aplicación, agregue:

# Imports
from django.shortcuts import render
from django.http import HttpResponse
from django.template import Context, loader


##
# Handle 404 Errors
# @param request WSGIRequest list with all HTTP Request
def error404(request):

    # 1. Load models for this view
    #from idgsupply.models import My404Method

    # 2. Generate Content for this view
    template = loader.get_template('404.htm')
    context = Context({
        'message': 'All: %s' % request,
        })

    # 3. Return Template for this view + Data
    return HttpResponse(content=template.render(context), content_type='text/html; charset=utf-8', status=404)

El secreto está en la última línea: status=404

Espero que haya sido de ayuda!

Espero ver los aportes de la comunidad a este enfoque. =)

Respondido 26 Abr '13, 14:04

Obtengo "no se pueden importar vistas de nombre" cuando escribo "vistas de importación de app1" en "views.py". El nombre de mi aplicación es "app1" - Timo

El urls.py de la aplicación significa: Si tiene un proyecto website y una aplicación blog. Entonces deberías agregar handler404 in website.urls.py no blog.urls.py - Cloud

Lo esencial:

Para definir una vista personalizada para manejar errores 404, defina en la configuración de URL, una vista para handler404, como handler404 = 'views.error404'

Aparte de lo básico, algunas cosas a tener en cuenta sobre (visitas personalizadas 404):

  1. Solo estará habilitado en Debug=False modo.
  2. Y más ignorado, en la mayoría de las respuestas (y esto me sacó los sesos).

    La vista 404 por defecto es

    django.views.defaults.page_not_found(request, exception, template_name='404.html')

    Observe el parámetro exception

    Esto estaba causando una redirección de 404 a 500 desde dentro def get_exception_response(self, request, resolver, status_code, exception) función definida en core.handlers.base ya que no pudo encontrar el parámetro exception

Respondido el 29 de Septiembre de 16 a las 14:09

+1 por mencionar Debug = False. No pude encontrar esto en otras respuestas SO. Esta variable debe establecerse utilizando variables de entorno y recuperarse como bool(os.getenv("DEBUG")) - OzzyElGigante

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.