Error personalizado de Django 404
Frecuentes
Visto 20,779 equipos
10
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.
3 Respuestas
16
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
12
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
6
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):
- Solo estará habilitado en
Debug=False
modo. 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 encore.handlers.base
ya que no pudo encontrar el parámetroexception
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 django http-status-code-404 or haz tu propia pregunta.
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ónblog
. Entonces deberías agregarhandler404
inwebsite.urls.py
noblog.urls.py
- Nube