Creare una sitemap in Django
Di mech06
Pubblicato Lunedì 15 Giugno 2020 21:40
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:
