Django

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ícate

Archivo 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 vista lista_entradas.
  • 'blog/<int:id>/' captura un entero id y lo pasa a detalle_entrada.
  • 'usuario/<str:username>/' captura una cadena username para perfil_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.

Para seguir leyendo hazte Plus

¿Ya eres Plus? Accede a la app

20 % DE DESCUENTO

Plan mensual

19.00 /mes

15.20 € /mes

Precio normal mensual: 19 €
58 % DE DESCUENTO

Plan anual

10.00 /mes

8.00 € /mes

Ahorras 132 € al año
Precio normal anual: 120 €
Aprende Django GRATIS online

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.

Accede GRATIS a Django y certifícate

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 y re_path.
  • Organizar URLs en proyectos complejos con include().
  • Personalizar manejo de errores 404 y 500.