Django
Tutorial Django: Enrutamiento básico
Django: Configura el enrutamiento con urls.py. Aprende a usar path, re_path y personalizar errores 404 y 500 en tu proyecto web.
Aprende Django GRATIS y certifícateArchivo urls.py
El archivo urls.py
es fundamental en un proyecto Django, ya que define el enrutamiento de las solicitudes URL entrantes hacia las vistas correspondientes. Ubicado en el directorio principal del proyecto, este archivo configura cómo Django interpreta y maneja las URLs solicitadas por los usuarios.
La estructura básica del archivo urls.py
es la siguiente:
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
# Otras rutas aquí
]
En este archivo, se importa la función path
desde django.urls
, que se utiliza para asociar patrones de URL con vistas específicas. La lista urlpatterns
es esencial, ya que Django la utiliza para resolver las URLs entrantes.
Cada entrada en urlpatterns
es una llamada a path()
que recibe:
- Un patrón de URL (cadena de texto).
- Una vista que manejará la solicitud.
- Opcionalmente, un nombre para la ruta.
Por ejemplo:
from django.urls import path
from . import views
urlpatterns = [
path('inicio/', views.inicio, name='inicio'),
path('about/', views.about, name='about'),
]
En este ejemplo, las rutas 'inicio/'
y 'about/'
se asocian con las funciones de vista inicio
y about
del módulo views
, respectivamente. Los nombres asignados mediante el argumento name
permiten una referencia más flexible de las rutas en las plantillas y otras partes del código.
Es importante que el archivo urls.py
esté correctamente configurado, ya que de ello depende que las solicitudes lleguen a las vistas correctas. Además, este archivo es el lugar donde se pueden incluir configuraciones adicionales, como el manejo de archivos estáticos durante el desarrollo.
Para proyectos más complejos, es posible que el archivo urls.py
importe vistas desde otros módulos o que utilice funciones adicionales para un enrutamiento más avanzado.
Uso de path y re_path
Las funciones path
y re_path
del módulo django.urls
son esenciales para definir las rutas de URL en tu aplicación. Estas funciones permiten mapear patrones de URL a vistas específicas, facilitando el enrutamiento de las solicitudes entrantes.
La función path
ofrece una sintaxis sencilla y legible para patrones de URL comunes. Utiliza convertidores de ruta para capturar variables directamente desde la URL. Por ejemplo:
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.lista_entradas, name='lista_entradas'),
path('blog/<int:id>/', views.detalle_entrada, name='detalle_entrada'),
path('usuario/<str:username>/', views.perfil_usuario, name='perfil_usuario'),
]
En este ejemplo:
'blog/'
corresponde a la vistalista_entradas
.'blog/<int:id>/'
captura un enteroid
y lo pasa adetalle_entrada
.'usuario/<str:username>/'
captura una cadenausername
paraperfil_usuario
.
Los convertidores de ruta disponibles son:
<int:valor>
: entero.<str:valor>
: cadena sin/
.<slug:valor>
: texto apto para URL (letras, números, guiones).<uuid:valor>
: identificador UUID.<path:valor>
: cadena que puede incluir/
.
La función re_path
es útil cuando necesitas patrones de URL más complejos que requieren expresiones regulares. Por ejemplo:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^cursos/(?P<codigo>[A-Z]{3}-\d{4})/$', views.detalle_curso, name='detalle_curso'),
]
Aquí, re_path
captura un codigo
con formato como 'ABC-1234', gracias a la expresión regular [A-Z]{3}-\d{4}
.
¿Cuándo usar cada función?
- Elige
path
para rutas simples y cuando los convertidores de ruta son suficientes. Su sintaxis es más clara y facilita el mantenimiento del código. - Opta por
re_path
si necesitas patrones más sofisticados que involucran expresiones regulares personalizadas.
Por ejemplo, si deseas capturar fechas en formato específico:
re_path(r'^eventos/(?P<year>\d{4})/(?P<month>\d{2})/$', views.eventos_mensuales, name='eventos_mensuales'),
Este patrón no puede representarse directamente con path
y requiere la flexibilidad de las expresiones regulares.
Es posible combinar ambas funciones en tu archivo urls.py
en un proyecto. La clave está en utilizar la herramienta que mejor se adapte al patrón de URL que deseas manejar.
Organización de las URLs
En proyectos de Django, es fundamental estructurar las rutas de forma modular para facilitar el mantenimiento y la escalabilidad. La función include()
es un método que permite dividir las configuraciones de URL entre las diferentes aplicaciones del proyecto.
En el archivo urls.py
del proyecto principal, se pueden delegar las rutas a los archivos urls.py
de cada aplicación:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
path('tienda/', include('tienda.urls')),
]
Con esta configuración, todas las URLs que comienzan con 'blog/'
serán manejadas por el archivo blog/urls.py
, y de manera similar para 'tienda/'
. Esto promueve una separación de responsabilidades, donde cada aplicación gestiona sus propias rutas.
Dentro de cada aplicación, el archivo urls.py
define las rutas específicas:
from django.urls import path
from . import views
urlpatterns = [
path('', views.lista_productos, name='lista_productos'),
path('<int:id>/', views.detalle_producto, name='detalle_producto'),
]
Es recomendable utilizar namespaces para evitar conflictos entre nombres de rutas similares en distintas aplicaciones. Al asignar un namespace, se especifica al incluir las URLs de la aplicación:
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include(('blog.urls', 'blog'), namespace='blog')),
path('tienda/', include(('tienda.urls', 'tienda'), namespace='tienda')),
]
Al referenciar estas rutas en plantillas o vistas, se utiliza el namespace seguido del nombre de la ruta:
<a href="{% url 'tienda:detalle_producto' id=producto.id %}">{{ producto.nombre }}</a>
Esta práctica garantiza una resolución precisa de las URLs, especialmente en proyectos con múltiples aplicaciones.
Para mantener una organización coherente, se sugieren las siguientes prácticas:
- Agrupar rutas relacionadas en listas o módulos dentro del archivo
urls.py
. - Nombrar las rutas de manera descriptiva y consistente.
- Documentar rutas complejas con comentarios aclaratorios.
- Evitar rutas redundantes o innecesariamente largas.
Una buena organización de las URLs mejora la legibilidad del código y facilita futuras ampliaciones o modificaciones. Al estructurar las rutas de forma modular y utilizar namespaces, se optimiza el enrutamiento y se reduce la posibilidad de errores.
Manejo de errores 404 y 500
El manejo de errores en Django es esencial para ofrecer una buena experiencia de usuario y proporcionar información útil cuando ocurren problemas en el sitio web. Los códigos de estado HTTP 404 (No Encontrado) y 500 (Error Interno del Servidor) son dos de los errores más comunes que pueden presentarse. Django proporciona mecanismos para personalizar y gestionar eficientemente estos errores.
Por defecto, cuando una URL solicitada no coincide con ninguna ruta definida, Django devuelve un error 404 utilizando una página de error genérica. De manera similar, si una excepción no controlada ocurre en una vista, se genera un error 500. Sin embargo, es recomendable personalizar estas páginas de error para que se ajusten al diseño del sitio y brinden información más amigable al usuario.
Para personalizar la página de error 404, se debe crear una plantilla llamada 404.html
en el directorio de plantillas raíz. Django buscará automáticamente esta plantilla cuando ocurra un error 404 en modo de producción. Por ejemplo:
project_root/
├── templates/
│ ├── 404.html
│ └── 500.html
Un ejemplo sencillo de 404.html
podría ser:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Página no encontrada</title>
</head>
<body>
<h1>Página no encontrada (404)</h1>
<p>La página que buscas no existe.</p>
</body>
</html>
Es importante asegurarse de que la configuración de DEBUG
esté desactivada (DEBUG = False
) en el archivo settings.py
para que Django utilice estas plantillas personalizadas en lugar de sus páginas de error predeterminadas.
Para manejar el error 500, se sigue un proceso similar. Se crea una plantilla 500.html
en el directorio de plantillas:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Error del servidor</title>
</head>
<body>
<h1>Error interno del servidor (500)</h1>
<p>Ha ocurrido un error inesperado. Por favor, inténtalo más tarde.</p>
</body>
</html>
Además de las plantillas, Django permite definir vistas personalizadas para manejar estos errores. Esto se hace en el archivo urls.py
del proyecto, asignando funciones de vista a las variables handler404
y handler500
:
from django.conf.urls import handler404, handler500
from . import views
handler404 = 'mi_proyecto.views.mi_error_404'
handler500 = 'mi_proyecto.views.mi_error_500'
urlpatterns = [
# ... tus patrones de URL ...
]
En este ejemplo, mi_error_404
y mi_error_500
son vistas que debes definir en el módulo views.py
de tu proyecto. Estas vistas pueden proporcionar lógica adicional, como registrar el error o mostrar información dinámica. Un ejemplo de vista personalizada para el error 404:
from django.shortcuts import render
def mi_error_404(request, exception):
return render(request, '404.html', status=404)
Y para el error 500:
def mi_error_500(request):
return render(request, '500.html', status=500)
Es fundamental que estas vistas establezcan el código de estado HTTP apropiado utilizando el parámetro status
.
Ten en cuenta que cuando DEBUG
está activado, Django muestra sus propias páginas de error con información detallada para facilitar la depuración. Por ello, para probar tus páginas de error personalizadas en un entorno de desarrollo, puedes configurar temporalmente DEBUG = False
y establecer un ALLOWED_HOSTS
adecuado, como se muestra a continuación:
DEBUG = False
ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
o utilizar la siguiente técnica:
def mi_error_404(request, exception):
response = render(request, '404.html')
response.status_code = 404
return response
Para forzar la visualización de la página 404, puedes acceder a una URL que no exista en tu aplicación.
Además de los errores 404 y 500, Django permite manejar otros códigos de error como 403 (Prohibido) y 400 (Solicitud Incorrecta) siguiendo el mismo patrón de personalización.
Es una buena práctica incluir en las páginas de error elementos como enlaces a la página de inicio o herramientas de búsqueda para ayudar al usuario a recuperarse del error. También se recomienda registrar los errores en los logs del servidor para monitorear y corregir problemas recurrentes.
El manejo adecuado de los errores 404 y 500 mejora la usabilidad y profesionalismo de tu sitio web, proporcionando una experiencia más coherente y útil para los usuarios.
Todas las lecciones de Django
Accede a todas las lecciones de Django y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Django
Introducción Y Entorno
Instalación Y Configuración Django Con Venv
Introducción Y Entorno
Arquitectura De Un Proyecto Django
Introducción Y Entorno
Base De Datos Mysql En Django
Modelos Y Base De Datos
Creación De Modelos
Modelos Y Base De Datos
Asociaciones De Modelos
Modelos Y Base De Datos
Migraciones
Modelos Y Base De Datos
Operaciones Crud Y Consultas
Modelos Y Base De Datos
Enrutamiento Básico
Vistas Y Plantillas
Plantillas Con Django Template Language
Vistas Y Plantillas
Vistas Basadas En Funciones
Vistas Y Plantillas
Vistas Basadas En Clases
Vistas Y Plantillas
Middlewares
Vistas Y Plantillas
Form Vs Modelform
Formularios
Procesamiento De Formularios
Formularios
Subida De Archivos
Formularios
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la función del archivo
urls.py
en Django. - Implementar rutas usando
path
yre_path
. - Organizar URLs en proyectos complejos con
include()
. - Personalizar manejo de errores 404 y 500.