Cómo crear "Sitemaps" en Django (Mapa de Sitio Web)

Categorías: Desarrollo Web

django

Es fácil crear mapas de sitios web (sitemaps) utilizando el framework web Django (lenguaje de programación Python). Django ya viene con un framework que permite crear mapas de sitios web en formato XML casi de manera automática.

Pero primero... ¿Qué es un mapa de sitio web?, ¿Sitemap?

De manera sencilla, un mapa de sitio web (sitemap) es un archivo XML en el servidor donde está tu sitio web, que detalla todas las URLS que tu sitio web contiene y la manera en que estas se relacionan las unas con las otras. Tu sitio web puede tener varios mapas de sitios web y estos a su vez, estar relacionados el uno con el otro en otro archivo XML llamado "Índice de mapa de sitio web" (Índice de Sitemap).

La ventaja de utilizarlos, es que les permite a los motores de búsqueda (Google, Yahoo, etc.) indexar tu sitio web de manera mucho más sencilla e incluso notificarles de cuando hay algún cambio en tu sitio web o indicarles la frecuencia con la que haces cambios para que de manera automática los "bots" de estos buscadores, identifiquen los cambios que hiciste.

Sitemaps en Django

Para hacer uso del framework de sitemaps que tenemos a nuestra disposición al usar Django, primeramente debemos asegurarnos de contar con el paquete 'django.contrib.sitemaps' incluido en nuestra configuración INSTALLED_APPS dentro del módulo settings.py del directorio de nuestro proyecto de Django. Normalmente, ya está incluido por default.

# mi_proyecto/settings.py

INSTALLED_APPS = [
    'miapp.apps.MiappConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django.contrib.sitemaps', # Debemos asegurarnos de que esto esté incluido
]

Luego de esto, dentro del módulo urls.py en el directorio de nuestro proyecto de Django, debemos importar el View "sitemap()" que se encuentra en views.py del paquete de sitemaps de Django y es esto es lo que utilizaremos principalmente para la creación de nuestro mapa de sitio web.

# mi_proyecto/urls.py

from django.contrib.sitemaps.views import sitemap
from django.urls import path

urlpatterns = [

    .......... # URLs de nuestro proyecto
    .......... # URLs de nuestro proyecto

    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
]

En el ejemplo anterior, el primer argumento a la función path() es de suma importancia debido a que los motores de búsqueda solamente pueden hacer referencia a los URLs de tu sitio web a partir de las URLs que sean descendientes de esta ubicación. Por ello, es recomendable que el URLs sea el base o raíz, ejemplo: es preferible simplemente 'sitemap.xml' en lugar de 'noticias/sitemap.xml' .

El segundo argumento que pasamos a la función path() es el view sitemap que importamos; el tercer argumento, debe ser {'sitemaps': sitemaps} y a su vez, sitemaps (el valor, no el key) debe ser un diccionario de python que contenga una clase de tipo Sitemap, lo cual vamos a ver en el próximo paso.

Clases "Sitemap" en Django

Lo que representa este tipo de clase de Python se puede conceptualizar como una clase que permite que se pueda acceder a diferentes objetos hijos de un modelo padre de Django, a través de diferentes URLs para cada objeto, ejemplo:

  • En el caso de un Blog, podemos tener un modelo de Django que sea de las "Publicaciones" en el cual, cada objeto representa una publicación individual, cada una con un URL distinto (creadas por el mismo patrón de URL, con keys/parámetros distintos).
  • En el caso de un sitio web que funciona como Directorio de restaurantes, tendríamos un modelo de "Restaurantes" en el cual cada restaurante individual sería un objeto a los cuales se puede acceder de manera individual con URLs distintos (creadas por el mismo patrón de URL, con keys/parámetros distintos).

Lo que nos permite hacer la clase "Sitemap" de Django, es acceder al enlace/URL de cada publicación de nuestro Blog, o cada restaurante de nuestro directorio y de manera sencilla representar todos estos enlances en el archivo XML del Sitemap.

Para esta publicación, utilizaremos el segundo ejemplo (Directorio de Restaurantes). Supongamos que el el patrón de URL que nos permite acceder a cada restaurante de manera individual, utilizando su ID es el siguiente:

# miapp/urls.py

from django.urls import path, include
from miapp.views import detalle_restaurante

urlpatterns = [
    path('restaurantes/detalle/<int:pk>/', miapp.views.detalle_restaurante, name='detalle-restaurante'),
]

Utilizemos la clase Sitemap, para crear una Subclase que tenga como función incluir en el Sitemap todos los URLs de cada uno de los diferentes restaurantes que tenemos en nuestro directorio, siguiendos los pasos descritos a continuación.

Dentro del directorio de nuestro proyecto de Django (directorio principal), creamos un módulo llamado sitemaps.py que contiene el siguiente código:

# mi_proyecto/sitemaps.py

from django.contrib.sitemaps import Sitemap # Importamos la clase Sitemap
from miapp.models import Restaurante # Importamos nuestro modelo

class RestauranteSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.5

    def items(self):
        return Restaurante.objects.filter(en_funcionamiento=True)

    def lastmod(self, obj):
        return obj.fecha_editado

En el snippet de código anterior, estamos creando una Sub Clase de la Clase "Sitemap", utilizamos dos Atributos de Clase y dos Métodos:

  • Los dos Atributos de Clase: "changefreq" & "priority", el primero indica la frecuencia con la que editamos el URLs en el cual se muestra cada objeto representado por el modelo "Restaurante", el segundo es la prioridad.
  • El método "items" debe retornar un queryset de objetos pertenecientes a la clase Restaurante, el método "lastmod" utiliza los objetos retornados por el método "items" y retorna la fecha en la cuál se editó en la base de datos cada objeto (restaurante).

En la documentación oficial de Django se puede encontrar mayor detalle de los métodos y atributos que se pueden definir al hacer uso de la clase "Sitemap":

Clase Sitemap en urls.py

El último paso para que nuestro Sitemap esté listo, es incluirlo dentro del módulo urls.py dentro del directorio de nuestro proyecto de Django.

# mi_proyecto/urls.py

from django.contrib.sitemaps.views import sitemap
from django.urls import path
from .sitemaps import RestauranteSitemap # Clase creada en el paso anterior!

sitemaps = {
    'restaurantes': RestauranteSitemap, # El key de este diccionario puede ser cualquier nombre
}

urlpatterns = [

    .......... # URLs de nuestro proyecto

    .......... # URLs de nuestro proyecto

    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
]

Luego de este último paso, guarda todo e inicia el servidor local y dirígete a la siguiente URL http://127.0.0.1:8000/sitemap.xml y podrás ver el Sitemap (mapa de sitio web) de tu sitio web de Django!.

Si te ha sido de ayuda esta publicación, no olvides suscribirte al blog!.

Regresar al blog