RSS wurde hinzugefügt, aber wir müssen den Suchmaschinen helfen, die Site zu indizieren. Und dies geschieht mithilfe von Sitemap -Dateien, die die Struktur der Site beschreiben. Django bietet vorgefertigte Klassen und Mechanismen zum Generieren von Sitemaps -Dateien, und es ist möglich, verschachtelte Sitemaps zu generieren, d Abschnitte. Django hat auch die Möglichkeit, Sitemaps zwischenzuspeichern, was nützlich ist, wenn Ihre Site Zehntausende von Links enthält.
Aus Sicht des aktuellen Stands der EVILEG COM-Site werden drei Sitemap-Dateien generiert, die in einer Hauptdatei verschachtelt werden:
- Haupt-Sitemap mit permanenten Seiten und der Hauptseite der Site;
- Sitemap-Abschnitte;
- Sitemap der Artikel.
Einrichten von settings.py
Zuerst richten wir die Konfigurationsdatei der Site ein, damit sie mit Sitemap-Dateien arbeiten kann.
SITE_ID = 1 INSTALLED_APPS = [ ... 'django.contrib.sitemaps', 'django.contrib.sites', ... ]
SITE \ _ID ist erforderlich, um die Ressource in der Datenbank zu identifizieren. Wenn dieser Parameter nicht hinzugefügt wird, ist es nicht möglich, die URL Ihrer Site im Site-Admin-Panel zu registrieren, für die die Sitemap erstellt wird. Die Sitemap für Suchmaschinen wird dann einfach nicht erstellt. Nachdem die Site-Einstellung im Admin-Panel angezeigt wurde, müssen Sie die Domain Ihrer Site registrieren, andernfalls beginnt die URL Sitemap mit example.com .
Was INSTALLED_APPS angeht, dann sollte alles klar sein. Das erste Modul ist für die Arbeit mit Sitemaps verantwortlich, und das zweite Modul ist direkt für die Arbeit mit dem Parameter SITE \ _ID in der Datenbank verantwortlich.
Einrichten von urls.py der Hauptanwendung der Site
Wenn ich von der Hauptanwendung spreche, meine ich die Anwendung, in deren Ordner sich die Datei settings.py befindet. In der aktuellen Implementierung der Site sind alle URL-Sitemaps in der Datei urls.py dieser Hauptanwendung beschrieben Anwendung der gesamten Website.
Lassen Sie uns herausfinden, was für was verantwortlich ist.
from django.contrib.sitemaps import views as sitemap_views # Представление from django.contrib.sitemaps import GenericSitemap # Шаблонный класс для формирования страницы Sitemap from django.views.decorators.cache import cache_page # Декоратор кеширования from knowledge import models as knowledge_models # Модели статей и разделов, по которым будет формироваться Sitemap from home.sitemap import HomeSitemap # Статический Sitemap для относительно постоянных страниц # Объект карты разделов. Здесь просто забираются все объекты из базы данных, # а также по одноимённому полю в модели забирается дата последней модификации sitemap_sections = { 'queryset': knowledge_models.Section.objects.all(), 'date_field': 'section_lastmod', } # А вот со статьями уже интереснее. Здесь забираются только те статьи, которые опубликованы # И для этого нужно будет написать специальный менеджер sitemap_articles = { 'queryset': knowledge_models.Article.objects.article_status(), 'date_field': 'article_date', } # Формируем объект со всеми картами и присваиваем им наименования sitemaps = { 'sections': GenericSitemap(sitemap_sections, priority=0.5), 'articles': GenericSitemap(sitemap_articles, priority=0.5), 'home': HomeSitemap } # Шаблоны URL, заметьте, здесь указано кеширование cache_page(86400) # Первый шаблон будет формировать основную карту сайта, в которой будут указаны URL дочерних, # То есть 'sitemap-sections', 'sitemap-articles', 'sitemap-home' # Заметили, что их названия перекликаются с названиями параметров в объекте sitemaps? urlpatterns += [ url(r'^sitemap\.xml$', cache_page(86400)(sitemap_views.index), {'sitemaps': sitemaps}), url(r'^sitemap-(?P<section>\w+)\.xml$', cache_page(86400)(sitemap_views.sitemap), {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'), ]
Statische Sitemap
Befassen wir uns zunächst mit einer statischen Sitemap, d. h. sie listet Seiten wie eine Kontaktseite, eine Startseite, Angebote usw. auf. In meinem Fall befindet es sich in der Heimanwendung.
from django.contrib import sitemaps from django.urls import reverse # Этот метод необходим, чтобы получить url из шаблона class HomeSitemap(sitemaps.Sitemap): priority = 0.5 # Приоритет changefreq = 'daily' # Частота проверки # Метод, возвращающий массив с url-ками def items(self): return ['home:index', 'home:contacts'] # Метод непосредственной экстракции url из шаблона def location(self, item): return reverse(item)
Abschnittsmodell
Um Sitemap-URLs aus dem Modell zu generieren, ist es notwendig, dass dieses Modell die Methode get \ _absolute \ _url hat. Und im Allgemeinen empfehle ich, diese Methode frühzeitig hinzuzufügen, da es sehr praktisch ist, sie beide in Vorlagen zu verwenden und an jeder anderen Stelle des Codes.
Ich belasse in diesem Modell nur das, was zum Generieren einer Sitemap erforderlich ist, um den Code nicht zu überladen.
class Section(models.Model): ... section_url = models.CharField('URL Раздела', max_length=50) def get_absolute_url(self): return reverse('knowledge:section', kwargs={'section': self.section_url})
Wie Sie sehen, enthält das Modell einen Teil der Abschnittsadresse, der in die Vorlage „Wissen: Abschnitt“ eingesetzt wird.
Artikelmodell
Hier ist das gleiche wie bei Abschnitten, außer dass ArticleManager hinzugefügt wird, das Objekte ersetzt, um den Methodensatz zu erweitern, zum Beispiel die Methode article \ _status , mit der nur diese Artikel abgerufen werden, die bereits veröffentlicht wurden. Und es ist diese Methode anstelle der all -Methode, die Sie in der Datei urls.py beim Generieren von Artikelzuordnungen sehen können.
class ArticleManager(models.Manager): use_for_related_fields = True def article_status(self): return self.get_queryset().exclude(article_status=False) class Article(models.Model): ... article_section = models.ForeignKey(Section) objects = ArticleManager() # объекты queryset подменяются менеджером # для расширения функционала def get_absolute_url(self): return reverse('knowledge:article', kwargs={'section': self.article_section.section_url, 'article_id': self.id})
Für Django empfehle ich Timeweb VDS-Server .