Jak automatycznie generować sitemap.xml w django?

Dobrą praktyką jest dodawanie do każdej strony, pliku sitemap.xml. Stanowi on cenne źródło informacji dla wyszukiwarek internetowych na temat naszych stron oraz ostatnich dat ich modyfikacji. Pozwala to na przekazanie wprost co należy indeksować i jak często.W dzisiejszym artykule, wykorzystamy wbudowaną aplikację django.crontrib.sitemaps do automatycznego ich generowania.


Zacznijmy od początku

W naszym pliku z aplikacjami, musimy zarejestrować nową wbudowaną aplikację która wykona większość pracy za nas.

blog_app/settings.py

INSTALLED_APPS = [
...
'django.contrib.sitemaps',
]

Teraz musimy stworzyć nowy plik w naszym projekcie, który będzie odpowiadał za dynamiczne generowanie ścieżek w naszej aplikacji. Wykorzystamy w tym przypadku:

  • stronę główną, z przykazaniem że ma mieć najwyższy priorytet oraz być aktualizowana codziennie,
  • dynamicznie generowane podstrony z artykułami, informując że mają być aktualizowane raz w tygodniu, przy czym tylko te opublikowane mają być indeksowane,

blog_app/sitemaps.py

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

class StaticViewSitemap(Sitemap):
priority
= 1
changefreq = 'daily'

def items(self):
return ['index']

def location(self, item):
return reverse(item)


class PostSitemap(Sitemap):
changefreq
= "weekly"
priority = 0.9

def items(self):
return Post.objects.all().filter(visible='P')

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

Aby moduł sitemap, mógł odpowiednio działać, wymagane jest dodanie do modelu:

  • kolumny updated, która przy każdej zmianie modelu będzie aktualizowała datę modyfikacji,
  • metody get_absolute_url, która pozwoli na odczytanie docelowego adresu url do naszego posta,

blog_app/models.py

class Post(models.Model):
...
updated = models.DateTimeField(_('Updated date'), auto_now=True)
slug = models.SlugField(max_length=255, blank=True)
visible = models.CharField(
_('Visible'),
max_length=1,
choices=visible_choice,
default="P",
)

def get_absolute_url(self):
return reverse('blog_article', kwargs={'slug': self.slug})

Następnie w naszym pliku z routingiem, należy podpiąć słownik z obiema spisami naszych adresów, pod metodę sitemap i zarejestrować ją.

blog_app/urls.py

from django.urls import path
from . import views, apiviews
from django.contrib.sitemaps.views import sitemap
from .sitemaps import StaticViewSitemap, PostSitemap

sitemaps_dict = {
'static': StaticViewSitemap,
'posts': PostSitemap,
}

urlpatterns = [
path('', views.PostListView.as_view(), name='index'), ...
path('post/<slug:slug>/', views.PostDetailView.as_view(), name='blog_article'),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps_dict}, name='sitemap'),
]

Podsumowanie

W paru prostych krokach, byliśmy w stanie stworzyć pełną mapę adresów url na naszej stronie. Przykładowo możesz sam drogi czytelniku, ją przetestować pod adresem https://blog.kamdev.pl/sitemap.xml.

Dodatkowo zalecam połączenie tej medoty z plikiem robots.txt, ale to temat na zupełnie inną publikację.

Kamil Mirończuk

I kiedy czegoś gorąco pragniesz, to cały wszechświat sprzyja potajemnie twojemu pragnieniu
~Paulo Coelho

Komentarze

Zostaw komentarz

Twój adres mailowy NIE zostanie opublikowany. W razie otrzymania zapytania, otrzymasz na niego odpowiedź.
Wymagane pola są oznaczone jako *