Evgenii Legotckoi
Evgenii Legotckoi24. September 2016 07:55

Django - Tutorial 008. Hinzufügen einer Sitemap-Datei zu einer Site basierend auf Django

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 .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 14:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 18:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr9. Februar 2024 02:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 18:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 10:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 22:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 16:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 11:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken