Django viene con un marco de trabajo de alto nivel para generar mapas del sitio que crean archivos XML de mapas del sitio.
Un mapa del sitio es un archivo XML en tu sitio web que indica a los indexadores de motores de búsqueda cuántas veces cambian tus páginas y qué tan «importante» son ciertas páginas en relación con otras páginas en tu sitio. Esta información ayuda a los motores de búsqueda a indexar tu sitio.
El marco de trabajo de mapas del sitio de Django automatiza la creación de este archivo XML permitiéndote expresar esta información en código Python.
It works much like Django’s framework de syndication. Para crear un mapa de sitios, escribe una clase Sitemap y apunta a ella en tu URLconf.
Para instalar la aplicación del mapa de sitios, sigue estos pasos:
Agrega 'django.contrib.sitemaps' a tu configuración INSTALLED_APPS.
Asegúrate de que tu configuración TEMPLATES contenga un backend DjangoTemplates cuyo parámetro APP_DIRS esté establecido en True. Por defecto, está así, por lo que solo necesitarás cambiarlo si has modificado esta configuración.
Asegúrate de haber instalado el framework de sitios.
Nota: La aplicación del mapa de sitios no instala ninguna tabla en la base de datos. El único motivo por el que necesita ir a INSTALLED_APPS es para que el cargador de plantillas Loader() pueda encontrar las plantillas predeterminadas.
Para activar la generación del mapa de sitios en tu sitio Django, agrega esta línea a tu URLconf:
from django.contrib.sitemaps.views import sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
)
Esto le dice a Django que construya un mapa de sitios cuando un cliente acceda a /sitemap.xml.
El nombre del archivo del mapa de sitios no es importante, pero la ubicación sí. Los motores de búsqueda solo indexarán enlaces en tu mapa de sitios para el nivel actual de URL y por debajo. Por ejemplo, si sitemap.xml vive en tu directorio raíz, puede referenciar cualquier URL en tu sitio. Sin embargo, si tu mapa de sitios vive en /content/sitemap.xml, solo podrá referenciar URLs que comiencen con /content/.
La traducción de los textos es la siguiente:
Sitemap classes¶Una clase Sitemap es una clase de Python que representa una «sección» de entradas en su mapa de sitio. Por ejemplo, una clase Sitemap podría representar todas las entradas de su blog, mientras que otra podría representar todos los eventos en su calendario de eventos.
En el caso más simple, todas estas secciones se agrupan juntas en un solo archivo sitemap.xml, pero también es posible utilizar la framework para generar un índice de mapa de sitio que refiera archivos de mapa de sitio individuales, uno por sección. (Ver Crear un índice de mapa de sitio a continuación.)
Las clases Sitemap deben heredar de django.contrib.sitemaps.Sitemap. Pueden vivir en cualquier parte de su base de código.
Supongamos que tiene un sistema de blog, con un modelo Entry, y quiere que su mapa de sitio incluya todos los enlaces a sus entradas individuales del blog. Aquí está cómo podría verse su clase de mapa de sitio:
from django.contrib.sitemaps import Sitemap
from blog.models import Entry
class BlogSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def items(self):
return Entry.objects.filter(is_draft=False)
def lastmod(self, obj):
return obj.pub_date
Nota:
changefreq y priority son atributos de clase correspondientes a <changefreq> y <priority> elementos, respectivamente. Pueden hacerse llamables como funciones, al igual que lastmod en el ejemplo.
items() es un método que devuelve una secuencia o QuerySet de objetos. Los objetos devueltos se pasarán a cualquier método llamable correspondiente a una propiedad del mapa de sitio (location, lastmod, changefreq, y priority).
No existe el método location en este ejemplo, pero puedes proporcionarlo para especificar la URL de tu objeto. Por defecto, location() llama a get_absolute_url() sobre cada objeto y devuelve el resultado.
Sitemap¶Una clase Sitemap puede definir los siguientes métodos/atributos:
Requerido. Un método que devuelva una secuencia o un QuerySet de objetos. El marco no se preocupa por el tipo de objetos que sean; lo único que importa es que estos objetos se pasen a los métodos location(), lastmod(), changefreq() y priority().
Opcional. O bien un método o atributo.
Si es un método, debe devolver la ruta absoluta para un objeto dado tal como lo devuelve items().
Si es un atributo, su valor debería ser una cadena que represente una ruta absoluta a utilizar para cada objeto devuelto por items().
En ambos casos, «ruta absoluta» significa una URL que no incluye el protocolo o dominio. Ejemplos:
Bien: '/foo/bar/'
Bad: 'example.com/foo/bar/'
Bad: 'https://example.com/foo/bar/'
Si no se proporciona el parámetro location, el framework llamará al método get_absolute_url() en cada objeto devuelto por items().
Para especificar un protocolo distinto de 'http', utilice protocol.
Opcional. O bien un método o atributo.
Si es una función, debe recibir como argumento un objeto devuelto por items() y devolver la fecha/hora de modificación más reciente del objeto como un datetime.
Si es una propiedad, su valor debería ser un datetime que represente la fecha/hora de modificación para todos los objetos devueltos por items().
Si todos los elementos en un mapa de sitios tienen una lastmod, el mapa de sitios generado por views.sitemap() tendrá un encabezado Last-Modified igual al último lastmod. Puede activar la clase ConditionalGetMiddleware para que Django responda adecuadamente a solicitudes con un encabezado If-Modified-Since que evitará enviar el mapa de sitios si no ha cambiado.
Opcional.
Esta propiedad devuelve un Paginator para items(). Si generas mapas de sitios en lotes, puede ser útil sobrescribir esta propiedad como una propiedad cacheada para evitar múltiples llamadas a items().
Opcional. O bien un método o atributo.
Si es una función, debe recibir como argumento un objeto devuelto por items() y devolver la frecuencia de cambio del objeto como una cadena.
Si es una propiedad, su valor debería ser una cadena que represente la frecuencia de cambio de cada objeto devuelto por items().
Los valores posibles para changefreq, ya sea que utilices un método o propiedad, son:
'siempre'
'horario'
'diario'
'semanal'
'mensual'
'anual'
'nunca'
Opcional. O bien un método o atributo.
Si es un método, debería tomar un argumento – un objeto devuelto por items() – y devolver la prioridad de ese objeto como una cadena o float.
Si es una atributo, su valor debe ser una cadena o un float que represente la prioridad de cada objeto devuelto por items().
Valores de ejemplo para priority: 0.4, 1.0. La prioridad predeterminada de una página es 0.5. Consulte la documentación sitemaps.org para más información.
Opcional.
Este atributo define el protocolo ('http' o 'https') de las URL en el mapa de sitios. Si no se establece, se utiliza el protocolo con el que se solicitó el mapa de sitios. Si el mapa de sitios se construye fuera del contexto de una solicitud, el valor predeterminado es 'https'.
Opcional.
Este atributo define el número máximo de URL incluidas en cada página del mapa de sitios. Su valor no debe exceder el valor predeterminado de 50000, que es el límite superior permitido en el protocolo Sitemaps.
Opcional.
Un atributo booleano que define si las URL de este mapa de sitios deben generarse utilizando todos tus IDIOMAS. El valor predeterminado es False.
Opcional.
Una secuencia de códigos de idioma a utilizar para generar enlaces alternativos cuando i18n está habilitado. Por defecto, utiliza IDOMAS.
Opcional.
Un atributo booleano. Cuando se utiliza conjuntamente con i18n, las URL generadas tendrán una lista de enlaces alternativos que apunten a versiones del idioma utilizando el atributo hreflang. El valor predeterminado es False.
Opcional.
Un atributo booleano. Cuando True, los enlaces alternativos generados por alternates contendrán una entrada de fallback con un valor de CÓDIGO DE IDIOMA. El valor predeterminado es False.
Opcional. Un método que devuelve el último valor devuelto por lastmod. Esta función se utiliza para agregar el atributo lastmod a las variables de contexto del mapa de sitios indexado: Sitemap index context variables.
Por defecto, get_latest_lastmod() devuelve:
Si lastmod es un método: El último lastmod devuelto al llamar el método con todos los elementos devueltos por Sitemap.items().
Opcional. Un método que devuelve la secuencia de códigos de idioma para los cuales se muestra el elemento. Por defecto, get_languages_for_item() devuelve languages.
El marco de trabajo del mapa del sitio proporciona una clase conveniente para un caso común:
La clase django.contrib.sitemaps.GenericSitemap permite crear un mapa del sitio pasándole un diccionario que debe contener al menos una entrada queryset. Este queryset se utilizará para generar los elementos del mapa del sitio. También puede tener una entrada date_field que especifica un campo de fecha para objetos recuperados desde el queryset. Esto se utilizará para el atributo lastmod y los métodos get_latest_lastmod() en el mapa del sitio generado.
Los argumentos de palabra clave priority, changefreq y protocol permiten especificar estos atributos para todas las URL.
Aquí tienes un ejemplo de una configuración de URL <URLconf </topics/http/urls>> utilizando la clase GenericSitemap:
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Entry
info_dict = {
"queryset": Entry.objects.all(),
"date_field": "pub_date",
}
urlpatterns = [
# some generic view using info_dict
# ...
# the sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"blog": GenericSitemap(info_dict, priority=0.6)}},
name="django.contrib.sitemaps.views.sitemap",
),
]
A menudo deseas que los crawlers de motores de búsqueda indexen vistas que no son páginas de detalles de objetos ni flatpages. La solución es enumerar explícitamente nombres de URL para estas vistas en items y llamar a reverse() en el método location del mapa del sitio. Por ejemplo:
# sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse
class StaticViewSitemap(sitemaps.Sitemap):
priority = 0.5
changefreq = "daily"
def items(self):
return ["main", "about", "license"]
def location(self, item):
return reverse(item)
# urls.py
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from .sitemaps import StaticViewSitemap
from . import views
sitemaps = {
"static": StaticViewSitemap,
}
urlpatterns = [
path("", views.main, name="main"),
path("about/", views.about, name="about"),
path("license/", views.license, name="license"),
# ...
path(
"sitemap.xml",
sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
),
]
La framework de mapas también tiene la capacidad de crear un índice de mapas que referencia archivos individuales de mapas, uno por cada sección definida en tu sitemaps diccionario. Las únicas diferencias en el uso son:
Utilizas dos vistas en tu URLconf: django.contrib.sitemaps.views.index() y django.contrib.sitemaps.views.sitemap().
La vista django.contrib.sitemaps.views.sitemap() debe recibir un argumento de palabra clave section.
Aquí está lo que las líneas relevantes del archivo URLconf deberían verse como para el ejemplo anterior:
from django.contrib.sitemaps import views
urlpatterns = [
path(
"sitemap.xml",
views.index,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.index",
),
path(
"sitemap-<section>.xml",
views.sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
),
]
Esto generará automáticamente un archivo sitemap.xml que refiera tanto a sitemap-flatpages.xml como a sitemap-blog.xml. Las clases de Sitemap y el diccionario sitemaps no cambian en absoluto.
Si todos los mapas tienen un lastmod devuelto por la función Sitemap.get_latest_lastmod(), el índice de mapas tendrá una cabecera Last-Modified igual al último lastmod.
Debes crear un archivo de índice si uno de tus mapas tiene más de 50.000 URLs. En este caso, Django paginará automáticamente el mapa y el índice reflejará eso.
Si no estás utilizando la vista de mapa vanilla – por ejemplo, si está envuelta con un decorador de caché – debes nombrar tu vista de mapa y pasar sitemap_url_name a la vista de índice:
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
urlpatterns = [
path(
"sitemap.xml",
cache_page(86400)(sitemaps_views.index),
{"sitemaps": sitemaps, "sitemap_url_name": "sitemaps"},
),
path(
"sitemap-<section>.xml",
cache_page(86400)(sitemaps_views.sitemap),
{"sitemaps": sitemaps},
name="sitemaps",
),
]
Si deseas utilizar un diferente plantilla para cada mapa de sitios o índice de mapas disponibles en tu sitio, puedes especificarlo pasando el parámetro template_name a las vistas sitemap y index mediante la URLconf:
from django.contrib.sitemaps import views
urlpatterns = [
path(
"custom-sitemap.xml",
views.index,
{"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
name="django.contrib.sitemaps.views.index",
),
path(
"custom-sitemap-<section>.xml",
views.sitemap,
{"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
name="django.contrib.sitemaps.views.sitemap",
),
]
Estas vistas devuelven instancias de TemplateResponse que permiten personalizar fácilmente los datos de respuesta antes de la renderización. Para más detalles, consulta la documentación de TemplateResponse.
Cuando se personalizan los plantillas para las vistas index() y sitemap(), puedes confiar en las siguientes variables de contexto.
La variable sitemaps es una lista de objetos que contienen los atributos location y lastmod para cada uno de los mapas del sitio. Cada URL expone los siguientes atributos:
location: La ubicación (URL y página) del mapa de sitio.
lastmod: Poblado por el método get_latest_lastmod() para cada mapa de sitios.
La variable urlset es una lista de URLs que deben aparecer en el mapa del sitio. Cada URL expone atributos según se definen en la clase Sitemap.
alternates
changefreq
item
lastmod
location
priority
La atributo alternates está disponible cuando están habilitados i18n y alternates. Es una lista de versiones en otros idiomas, incluyendo la versión por defecto opcional x_default, para cada URL. Cada alternativa es un diccionario con claves location y lang_code.
El atributo item se ha agregado para cada URL para permitir una personalización más flexible de los templates, como por ejemplo los mapas de sitios de noticias de Google. Suponiendo que items() devolvería una lista de items con publication_data y un campo tags, algo así generaría un mapa compatible con Google News:
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:news="https://www.google.com/schemas/sitemap-news/0.9">
{% spaceless %}
{% for url in urlset %}
<url>
<loc>{{ url.location }}</loc>
{% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
{% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
{% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
<news:news>
{% if url.item.publication_date %}<news:publication_date>{{ url.item.publication_date|date:"Y-m-d" }}</news:publication_date>{% endif %}
{% if url.item.tags %}<news:keywords>{{ url.item.tags }}</news:keywords>{% endif %}
</news:news>
</url>
{% endfor %}
{% endspaceless %}
</urlset>
may 31, 2026