jueves, 16 de noviembre de 2023

17.2- Añadir un mapa del sitio para nuestro proyecto.

Un mapa del sitio es un documento XML que contiene todas las URL importantes de nuestro sitio web. Los buscadores lo utilizan como herramientas de navegación para indexar sus sitios web, rastrean e indexan de manera mas rápida y eficiente usando este sistema. 

Es por esto por lo que es conveniente tener un "sitemap" para nuestro sitio, ya que así se automatiza el envío de nuestras páginas web a los servidores de los buscadores. Esto es una de las técnicas que se utilizan para mejorar nuestro posicionamiento en los motores de búsqueda.

Por suerte, Django viene con un framework para crear "sitemap". Para utilizarlo tenemos que registrar dentro de las aplicaciones instaladas, tanto "sites" como "sitemap" de la siguiente forma. Edita el archivo "settings.py" de la aplicación PracticaDjango y añade el código sombreado:


PracticaDjango/PracticaDjango/settings.py

    # Aplicaciones de terceros
    'django_bootstrap5',
    # Mapa del Sitio
    'django.contrib.sites', # add sites to installed_apps
    'django.contrib.sitemaps',  # add Django sitemaps to installed app
    # Aplicaciones por defecto
    'django.contrib.admin',
    # ...

Ejecuta las migraciones para añadir el "sitemaps" a la base de datos:

python manage.py makemigrations

python manage.py migrate

Lo siguiente es añadir el nombre de nuestro dominio a los Sitios.

  • En el terminal ejecutamos: python manage.py runserver
  • Ve al administrador de Django y entra usando tus credenciales.
  • Ve a la sección Sitios y haz clic en añadir sitio.
Sección Sitios en el administrador de Django
Como nombre de dominio que aparece por defecto está example.com. Pincha en él, para cambiarlo. Aquí puedes poner el dominio o host que será usado por el framework sites y sus aplicaciones. En un entorno de producción deberás usar el nombre de dominio de tu página web, pero mientras estemos desarrollando la aplicación cámbialo a 127.0.0.1:8000 que es nuestro local host.

Cambiar el sitio en el panel de admon de Django


Puedes encontrar más información sobre el framework sites en https://docs.djangoproject.com/en/4.2/ref/contrib/sites/.

El siguiente paso es crear un nuevo archivo llamado sitemaps.py. Lo crearemos dentro del directorio de la aplicación práctica Django. En el, crearemos un sitemap dinámico para la aplicación Blog y un sitemap estático para el resto de las vistas de nuestra página web. (exceptuando la vista para la tienda que aún no la tenemos creada)

PracticaDjango/PracticaDjango/sitemaps.py

from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from Blog.models import Post

class BlogSitemap(Sitemap):
    changefreq = "monthly"
    priority = 0.8
    protocol = 'http'

    def items(self):
        return Post.objects.all()
    
    def lastmod(self, obj):
        return obj.updated

    # def location(self, obj):
    #     return '/blog/%s' % (obj.slug)
    
class StaticSitemap(Sitemap):
    changefreq = "yearly"
    priority = 0.8
    protocol = 'http'
 
    def items(self):
        return ["Proyecto_web_app:home",
                "Servicios:servicios",
                "Contacto:contacto",
                ] #devuelve las páginas estáticas; 
 
    def location(self, item):
        return reverse(item) #devuelve las URL de las páginas estáticas; 

Hemos creado un sitio personalizado que hereda de la clase Sitemap del modulo sitemaps. El atributo "changefreq"  indica la frecuencia con la que se cambian las páginas. El atributo "priority" indica la relevancia dentro de la página web (el valor máximo es 1). El protocólo es "http" o "https", utiliza "https" en entornos de producción.

El método item() devuelve todos los objetos del modelo que queramos que se listen en el mapa del sitio. Por ejemplo la clase BlogSiteMap devuelve todos los post del blog. Por defecto Django llama al método get_absolute_url() que recuerda ya habíamos definido en el modelo de Post. Si quisiéramos especificar una URL para cada objeto tendríamos que hacer uso del método "locate". En este caso no porque tenemos definido previamente un get_absolute_url().

También hemos creado una clase para las páginas estáticas de nuestro proyecto, los nombres de las URL las hemos obtenido utilizando el método reverse para obtener la URL absoluta de estas páginas.

Hemos añadido las páginas estáticas: 'home', 'servicios' y 'contacto' porque son las que tenemos ya creadas. (la página para la tienda la trataremos en post posteriores). Para ello usamos los nombres a las que están conectados. Por ejemplo la vista para servicios en su archivo urls.py esta conectada al nombre "Servicios:servicios"

Tu decides que páginas estáticas quieres que aparezcan en tu "directorio", encuentra y selecciona el nombre de la URL de su aplicación, después inclúyela en el método item() dentro de la clase StaticSiteMap.

De donde sale Servicios:servicios para incluirlo en el item() de las páginas estáticas.

from django.urls import path

from . import views

app_name = 'Servicios'

urlpatterns = [
    path('', views.servicios, name='servicios'),
]

Después de que creamos el sitemap, tenemos que crear una URL para él. Edita el archivo urls.py de la aplicación PracticaDjango y añade el sitemap de la siguiente forma. Las nuevas líneas están resaltadas.



from django.contrib import admin
from django.urls import path, include

from django.conf import settings
from django.conf.urls.static import static

from django.contrib.sitemaps.views import sitemap
from .sitemaps import BlogSitemap, StaticSitemap

sitemaps = {
    'static':StaticSitemap, #add StaticSitemap to the dictionary
    'blog':BlogSitemap #add DynamicSitemap to the dictionary
}

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('Proyecto_web_app.urls')),
    path('servicios/', include('Servicios.urls')),
    path('blog/', include('Blog.urls')),
    path('contacto/', include('Contacto.urls')),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
urlpatterns+=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


En el código superior hemos añadido las importaciones necesarias, y definido un diccionario llamado sitemaps. Se pueden usar varios directorios para el sitio. Hemos definido un patrón URL que coincide con el patrón sitemap.xls y utiliza la vista del mapa del sitio proporcionada por Django. El diccionario sitemaps se pasa a la vista del mapa del sitio. 

Por fin el mapa del sitio proporcionado por Django lo podemos encontrar en http://127.0.0.1/sitemap.xls. Ejecuta el servidor de desarrollo con "python manage.py runserver" y ve a esa dirección. Deberías ver todos los post del blog y las páginas estáticas que hayas añadido.


http://127.0.0.1/sitemap.xls

<urlset>
<url>
<loc>http://127.0.0.1:8000/</loc>
<changefreq>yearly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://127.0.0.1:8000/servicios/</loc>
<changefreq>yearly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://127.0.0.1:8000/contacto/</loc>
<changefreq>yearly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/11/13/post-usando-markdown/
</loc>
<lastmod>2023-11-13</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/27/post-septimo/
</loc>
<lastmod>2023-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://127.0.0.1:8000/blog/2023/10/27/post-sexto/</loc>
<lastmod>2023-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/27/quinto-post-para-ver-la-paginacion/
</loc>
<lastmod>2023-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/15/cuarto-post-para-ver-como-funciona-el-slug/
</loc>
<lastmod>2023-10-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/15/este-primer-post-prueba/
</loc>
<lastmod>2023-10-15</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/15/tercer-post-para-ver-como-sigue/
</loc>
<lastmod>2023-10-15</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>
http://127.0.0.1:8000/blog/2023/10/15/segundo-post-para-probar-mas/
</loc>
<lastmod>2023-10-15</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>

Código de este capitulo en GitHub.


No hay comentarios:

Publicar un comentario