Creare una sitemap in Django

Di mech06


Pubblicato Lunedì 15 Giugno 2020 21:40


img_post/sitemap-4059862_1280.jpg

La sitemap è molto utile nel momento in cui vogliamo andare a migliorare l'indicizzazione del nostro sito all'interno dei motori di ricerca, per questo è un argomento molto caro ai SEO admin.

Di base la sitemap è un file xml che espone gli url del nostro sito mettendo a conoscenza il motore di ricerca delle risorse disponibili in esso.

Per maggiori informazioni su come questo xml è costruito è possibile consultare l'url: https://www.sitemaps.org/it/protocol.html ( eh si...è disponibile anche in italiano! ) per avere tutte le informazioni.

In questo articolo ci occuperemo di creare una sitemap per un sito Django. Supporremo di avere un blog e di dover creare la sitemap dei post di questo blog.

Ma partiamo dall'inizio, la versione di Django che utilizzeremo sarà la 2.2 e la prima cosa da fare, è includere nel file settings.py la app per la creazione delle sitemap della quale dispone django:


# settings.py

INSTALLED_APPS = [
    ....
    'django.contrib.sitemaps',
    ....
]
Immagininiamo poi di avere una nostra app che chiameremo Post, la quale si farà carico di gestire i post nel nostro blog. Utilizziamo a scopo di esempio un modello come quello qui sotto:

# models.py

from django.db import models
from django.urls import reverse

class Post( models.Model ):

    titolo = models.CharField( max_length = 512, unique = True )
    slug = models.SlugField( max_length= 100, unique = True)
    testo  = models.TextField()
    data_creazione = models.DateTimeField( auto_now_add = True )
    data_ultima_modifica = models.DateTimeField ( auto_now = True )
    autore = models.CharField( max_length= 512 )

    def __str__(self):
        return "Titolo:{} Autore:{} Ultima modifica:{}".format( self.titolo, self.autore, 
                                                                self.data_ultima_modifica )

    def get_absolute_url(self):
        return "/posts/%s/" % self.slug

A questo punto dobbiamo creare una classe che deriva dalla classe sitemap e che avrà nel nostro esempio due metodi:

  • Items (richiesto): il quale deve tornare un queryset che espone gli oggetti del quale dobbiamo creare la sitemap ( nel nostro caso i post del nostro blog )
  • Lastmod (opzionale): il quale torna un datetime che può rappresentare l'ultima data in cui il contenuto è stato modificato

Esistono poi altri metodi ed opzioni per la quale è consigliabile andare a vedere la documentazione ufficiale di django ( https://docs.djangoproject.com/en/2.2/ref/contrib/sitemaps/ ).

Creeremo quindi un nuovo file sitemap.py nella nostra app post:

# sitemap.py

from django.contrib.sitemaps import Sitemap
from .models import Post

class PostSitemap( Sitemap ):
    """
    Classe sitemap del modello Post
    """
    
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Post.objects.all()

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

Oltre ai due metodi di cui abbiamo parlato notiamo anche la presenza di due variabili:

  • changefreq: che identifica la frequenza con la quale viene cambiato il contenuto rappresentato dalla classe sitemap che stiamo implementando
  • priority: è la priorità degli url, che in questo caso rappresentano i post del nostro ipotetico blog rispetto ad altri contenuti del sito. Il valore può andare tra 0,0 e 1,0. Il default è 0,5.

A questo punto dobbiamo modificare il file urls.py del nostro blog in modo tale da poter servire il file sitemap:


# urls.py

from django.contrib import admin
from django.urls import path
from django.contrib.sitemaps.views import sitemap
from post.sitemap import PostSitemap

# Dizionario delle sitemaps.
sitemaps = { 'post' : PostSitemap }

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

Vediamo meglio step by step cosa andiamo a fare in quest'ultima parte. Importiamo la views necessaria per renderizzare la sitemap dal framework sitemap di Django e la classe creata in precedenza: 


from django.contrib.sitemaps.views import sitemap
from post.sitemap import PostSitemap

Creiamo un dizionario che metta in relazione un'etichetta con la classe PostSitemap creata in precedenza:


# Dizionario delle sitemaps.
sitemaps = { 'post' : PostSitemap }

Infine andiamo a sistemare l'url, è consigliabile fare in modo che la sitemap sia posta nella root del sito, quindi scriveremo:


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

Possiamo quindi andare ad avviare il server di sviluppo e visitare la pagina http://127.0.0.1:8000/sitemap.xml per vedere il risultato.

Nel nostro caso, se il blog fosse un blog di ricette potremmo vedere un risultato di questo tipo:



Torna alla home

Oppure esplora gli altri articoli sugli stessi argomenti:

#Python #Django