Sitemap w aplikacji Django – strony statyczne

Niedawno chwaliłam się pierwszą opublikowaną przeze mnie aplikacją napisaną w Django. Wiążę z tym portalem wiele nadziei, z reszta nie tylko ja ale i inne osoby, które pomagają mi go współtworzyć i zależy nam na tym, żeby go popularyzować. Jedną z podstawowych rzeczy jakie należy w związku z tym zrobić to poinformowanie Google o tej stronie i przesłanie pliku sitemap.xml
Django daje możliwość dynamicznego tworzenia pliku sitemap.xml tak aby był on zawsze aktualny ilekroć będzie wywoływany. Służy do tego framework sitemaps, który należy do swojej witryny dołączyć a następnie umiejętnie wykorzystać. Zatem po kolei.

Dodajemy framework sitemaps

Wpierw należy edytować plik settings.py i dodać do nich następujące wiersze:

#settings.py
INSTALLED_APPS = [
    ...
    ...
    ...
    'django.contrib.sites',
    'django.contrib.sitemaps',
]

To pozwoli dołączyć odpowiednie frameworki, które są niezbędne przy tworzeniu sitemap. Następnie należy jeszcze dodać parametr:

#settings.py
SITE_ID=1

Bez tego nie zadziałał żaden tutorial znaleziony przeze mnie w sieci. Niestety jest to konieczne w nowszych wersjach Django, jak również ręczne dołączenie frameworku sites, co dawniej odbywało się automatycznie. Należy też zadbać o odpowiednią konfigurację TEMPLATES, chodzi o ustawienie parametru APP_DIRS na wartość True:

#settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

Żeby wszystko miało szanse zadziałać nalezy jeszcze w wirtualnym środowisku, w konsoli, wykonać komendę:

$ python manage.py migrate

A to ze względu na framework ‘site’, o czym inne poradnik też milczą.

Konfiguracja w panelu administracyjnym

Następnym krokiem jest ustawienie odpowiednich wartości dla wskazanej strony o ID=1, czego dokonuje się w Panelu Administracyjnym naszej aplikacji. Po zalogowaniu daje się zauważyć nową pozycję.

Po wejściu do sekcji ‘Strony’ ukaże nam się lista stron złożona z jednej pozycji o indeksie 1 właśnie i to jej ustawienia należy edytować przypisując jej odpowiednią domenę i nazwę. Pominięcie tego kroku spowoduje dodanie nieprawidłowej, przykładowej nazwy domeny do linków w pliku sitemap.xml.

Tworzenie listy stron statycznych

Przez strony statyczne należy rozumieć takie, które mają swoje indywidualne konfiguracje na liście url w naszej aplikacji i nie mają żadnych parametrów. Jak strona ‘o nas’, ‘kontakt’ itp. Aby taką listę stworzyć potrzebny będzie plik sitemaps.py umieszczony w głównym katalogu aplikacji (tam gdzie plik settings.py). U mnie zawartość tego pliku w przypadku wygląda następująco:

#sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.core.urlresolvers import reverse


class StaticSitemap(Sitemap):
     priority = 0.8
     changefreq = 'weekly'

     # The below method returns all urls defined in urls.py file
     def items(self):
         return ['index', 'article:article_list','faq:faq']

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

W pierwszych dwóch wierszach dołączamy niezbędne pakiety. Następnie definiujemy klasę StaticSitemaps, na którą później będziemy się powoływać. Wewnątrz klasy minimalna konfiguracja w postaci parametrów priority oraz changefreq. Opis wszystkich parametrów mozna znaleźć w dokumentacji pakietu sitemaps albo na blogu Django Easy Tutorial Następnie znajdują się definicje dwóch, niezbędnych metod. Pierwsza przygotowuje i zwraca listę nazw URLi a druga odwraca tę listę do postaci konkretnych linków zgodnie z ich definicją w plikach urls.py

Namespaces

Ponieważ linki pochodzą z różnych aplikacji, konieczne jest wprowadzenie i wykorzystywanie przestrzeni nazw (ang. namespace). Dlatego na liście nazw linków w klasie StaticSitemap zamiast:

[‘index’, ‘article_list’,’faq’]

mamy:

[‘index’, ‘article:article_list’,’faq:faq’]

Pierwszy człon, ten przed dwukropkiem to własnie nazwa przestrzeni nazw (po polsku to jednak masło maślane). To wymaga modyfikacji definicji routingu w głównym pliku urls.py i dodania parametrów namespace:

#urls.py
urlpatterns = [
    url(r'', include('home.urls')),
    url(r'^article/', include('article.urls', namespace='article')),
    url(r'^faq/', include('faq.urls', namespace='faq')),
]

Taki ruch niestety wymusza poprawienie wszystkich linków w aplikacji i wykorzystanie parametrów namespace wszędzie gdzie w szablonach wykorzystujemy funkcję url
Czyli zamiast

≶a href=”{% url ‘article_list’ %}”>Artykuły≶/a>

wpisujemy:

≶a href=”{% url ‘article:article_list’ %}”>Artykuły≶/a>

W sumie to nawet praktyczne jest by wyrobić sobie taki nawyk od początku, bo przy bardzo rozbudowanych aplikacjach trudno jest kontrolować unikalność nazw linków, parametr namespace znacznie to ułatwia.

Link do sitemap.xml

I ostatnim ruchem, który musimy wykonać to stworzenie linku do wirtualnego pliku sitemap.xml, który będzie generował się dynamicznie. W tym celu należy zmodyfikować główny plik urls.py aplikacji do następującej postaci:

#urls.py
from django.contrib.sitemaps.views import sitemap
from .sitemaps import StaticSitemap

sitemaps = {
   'static': StaticSitemap,
}

urlpatterns = [
    url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
    url(r'', include('home.urls')),
    url(r'^article/', include('article.urls', namespace='article')),
    url(r'^faq/', include('faq.urls', namespace='faq')),
    ...
]

– wiersz 2: dołączamy widok konieczny do stworzenia pliku sitemap.xml,
– wiersz 3: dołączamy klasę z naszą definicją statycznych linków,
– wiersz 5: lista klas, które dostarczają danych do pliku sitemap.xml, może być ich więcej na przykład definicje linków dynamicznych,
– wiersz 10: definicja URLa kierującego do wirtualnego pliku sitemap.xml

I już działa. A jak działa można sprawdzić na Portalu Edukatorów Domowych
, z tym, że tam są równiez definicje adresów dynamicznych, ale o tym już wkrótce.

Leave a Reply

%d bloggers like this: