Al desarrollar en Django, a menudo queremos mostrar una página 404 personalizada utilizando código como raise Http404("Page not found.")
.
En este artículo, organizaremos de forma práctica las causas de error 404, cómo conectar plantillas y cómo manejar errores 403/500.
1. Métodos comunes para provocar un error 404
He clasificado las situaciones en las que se produce un error 404 en Django, y creo que las siguientes 4 son las más comunes.
1. raise Http404("Descripción")
Este es el método más básico para provocar explícitamente un error 404.
from django.http import Http404
def my_view(request):
if not condition:
raise Http404("Page not found.")
2. get_object_or_404()
Es una función de atajo comúnmente utilizada en Django. Provoca automáticamente un 404 si el objeto no existe.
from django.shortcuts import get_object_or_404
post = get_object_or_404(Post, pk=pk)
3. Manejo de excepciones al usar Model.objects.get()
En este caso, también debe provocar manualmente un 404.
from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist
try:
post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
raise Http404("Post not found.")
4. Cuando no existen URLConf o View
A diferencia de los puntos 1 a 3, no es un 404 provocado intencionalmente por el desarrollador, pero cuando una solicitud accede a una URL que no existe, Django provocará automáticamente un 404 internamente.
2. Métodos de personalización
Requisitos previos
- El nombre de la plantilla debe ser
404.html
. - En
settings.py
, debe estar configurado lo siguiente: DEBUG = False
- Se debe configurar
ALLOWED_HOSTS
- La plantilla
404.html
debe estar en una ubicación donde Django pueda encontrarla.
Ubicación de la plantilla
Ubicación | Descripción |
---|---|
project_root/templates/404.html |
La ubicación más común y confiable |
app_name/templates/404.html |
Posible, pero necesita la condición APP_DIRS = True |
app_name/templates/app_name/errors/404.html |
No se reconoce automáticamente, es necesario configurar handler404 |
Ejemplo de conexión manual a través de handler404
# views.py
def custom_404_view(request, exception):
return render(request, 'myapp/errors/404.html', status=404)
# urls.py
handler404 = 'myapp.views.custom_404_view'
3. ¿Es posible personalizar errores 403 y 500?
✔ Django permite personalizar páginas de error además del 404:
Código de error | Nombre de plantilla predeterminada | Descripción |
---|---|---|
403 | 403.html |
Permiso denegado |
404 | 404.html |
Página no encontrada |
500 | 500.html |
Error interno del servidor |
400 | 400.html |
Solicitud incorrecta |
✔ Los requisitos básicos son los mismos
- La plantilla se aplicará solo si
DEBUG = False
. - La plantilla debe existir en la ruta bajo
TEMPLATES['DIRS']
oAPP_DIRS=True
. - Si es necesario, se pueden registrar manualmente
handler403
,handler400
yhandler500
para conectarlos a vistas específicas.
Resumen
Elemento | Contenido |
---|---|
Uso de raise Http404 |
Renderizado automático de la plantilla 404.html |
get_object_or_404() |
Provoca automáticamente un 404 si el objeto no existe |
Nombre de plantilla | Debido a que se deben utilizar nombres fijos como 404.html , 403.html , etc. |
Condiciones de directorio | Debe estar dentro de TEMPLATES['DIRS'] o APP_DIRS |
Condiciones de DEBUG | La plantilla personalizada solo se aplicará cuando DEBUG = False |
Uso avanzado | Se pueden conectar vistas específicas con handler404 , handler500 , etc. |
Add a New Comment