Café y Código

1. URLs y Enrutamiento Avanzado 🌐

El enrutador de URLs es la primera parada en el patrón MVT de Django. Inspecciona la URL recibida en la petición HTTP y decide qué vista debe procesar la solicitud.

SUBMÓDULO 1.1

El Patrón MVT y el Enrutador de Rutas

Django organiza las aplicaciones bajo el patrón Model (ORM), View (Lógica) y Template (HTML). El enrutador analiza la URL solicitada y determina la vista receptora.

Arquitectura MVT de Django
🔍Clic para ampliar
Diagrama del patrón MVT en Django: URL Dispatcher -> View -> Model/Template (clic para ampliar).
SUBMÓDULO 1.2

Estructura Modular y Namespaces

En proyectos profesionales, el archivo principal config/urls.py delega el tráfico a las URLs de cada app mediante include() y define espacios de nombres para evitar colisiones entre rutas con el mismo nombre.

config/urls.py
PYTHON
1# config/urls.py (Enrutador Principal del Proyecto)
2from django.contrib import admin
3from django.urls import path, include
4
5urlpatterns = [
6 path('admin/', admin.site.urls),
7
8 # Delegación modular a la app 'biblioteca' con espacio de nombres
9 path('biblioteca/', include('biblioteca.urls'), namespace='biblioteca'),
10]
SUBMÓDULO 1.3

Path Converters Nativos

Django incluye 5 convertidores automáticos de rutas que capturan segmentos de la URL y los transforman al tipo de dato en Python antes de entregarlos a la vista:

  • <int:id>: Enteros positivos (ej: /libro/42/id = 42).
  • <slug:slug>: Cadenas alfanuméricas amigables para SEO (ej: /libro/clean-code/).
  • <str:cadena>: Texto simple sin barras (ej: /autor/gabriel/).
  • <uuid:token>: Identificadores UUID v4 (ej: /prestamo/550e8400-e29b-41d4-a716-446655440000/).
  • <path:subruta>: Captura rutas completas incluyendo barras (ej: /archivos/2024/09/doc.pdf).
biblioteca/urls.py
PYTHON
1# biblioteca/urls.py (Enrutador de la Aplicación)
2from django.urls import path
3from . import views
4
5app_name = 'biblioteca'
6
7urlpatterns = [
8 path('', views.catalogo_libros, name='catalogo'),
9 path('libro/<int:pk>/', views.libro_detalle_id, name='libro_detalle_id'),
10 path('libro/slug/<slug:slug>/', views.libro_detalle_slug, name='libro_detalle_slug'),
11 path('prestamo/<uuid:codigo>/', views.comprobante_prestamo, name='comprobante_prestamo'),
12]
SUBMÓDULO 1.4

Convertidores Personalizados (Custom Path Converters)

Permiten validar reglas de negocio complejas en la URL (como un código ISBN o un año de 4 dígitos) mediante una clase con atributo regex y métodos to_python() y to_url().

biblioteca/converters.py
PYTHON
1# biblioteca/converters.py
2import re
3
4class ISBNConverter:
5 """Valida códigos ISBN de 10 o 13 dígitos y limpia guiones automáticamente."""
6 regex = r'(?:(?:d{3}[- ]?)?d{1,5}[- ]?d+[- ]?d+[- ]?[dX])'
7
8 def to_python(self, value: str) -> str:
9 return re.sub(r'[- ]', '', value)
10
11 def to_url(self, value: str) -> str:
12 return str(value)

Registro e integración en el archivo de rutas:

biblioteca/urls_custom.py
PYTHON
1# biblioteca/urls.py
2from django.urls import path, register_converter
3from . import converters, views
4
5register_converter(converters.ISBNConverter, 'isbn')
6
7urlpatterns = [
8 path('libro/isbn/<isbn:codigo>/', views.libro_por_isbn, name='libro_por_isbn'),
9]
SUBMÓDULO 1.5

Expresiones Regulares con re_path()

Para patrones de ruta que requieren expresiones regulares exactas (como fechas combinadas con nombres de sección):

re_path.py
PYTHON
1from django.urls import re_path
2from . import views
3
4urlpatterns = [
5 re_path(
6 r'^archivo/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<seccion>[a-zA-Z0-9_-]+)/$',
7 views.archivo_historico,
8 name='archivo_historico'
9 ),
10]
SUBMÓDULO 1.6

Query Parameters (Parámetros GET)

Los parámetros tras el signo de interrogación (?q=python&categoria=backend) se capturan en la vista mediante el diccionario de consulta request.GET:

captura_query_params.py
PYTHON
1def catalogo_libros(request):
2 busqueda = request.GET.get('q', '').strip()
3 categoria = request.GET.get('categoria', None)
4 tags_seleccionados = request.GET.getlist('tag')
5
6 return render(request, 'catalogo.html', {
7 'busqueda': busqueda,
8 'categoria': categoria,
9 'tags_seleccionados': tags_seleccionados,
10 })
SUBMÓDULO 1.7

Generación Inversa de URLs (Reverse Resolution)

Evita URLs estáticas escritas a mano. Genera URLs dinámicamente con reverse() en Python o el tag {% url %} en las plantillas HTML:

reverse_python.py
PYTHON
1# En vistas o redirecciones Python:
2from django.urls import reverse
3url_libro = reverse('biblioteca:libro_detalle_id', kwargs={'pk': 15})
url_template.html
HTML
1<!-- En plantillas HTML: -->
2<a href="{% url 'biblioteca:libro_detalle_slug' slug=libro.slug %}">
3 Ver detalle de {{ libro.titulo }}
4</a>
Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.