Evgenii Legotckoi
Evgenii Legotckoi24 сентября 2016 г. 7:55

Django - Урок 008. Добавление файлов Sitemap на сайт с Django

RSS добавлена, но нужно помочь поисковым системам индексировать сайт. А делается это с помощью файлов Sitemap, которые описывают структуру сайта. Django предоставляет готовые классы и механизмы для формирования файлов Sitemap , причём имеется возможность для формирования вложенных в основной Sitemap , то есть дочерних файлов Sitemap , которые будут отвечать за определённые разделы. Также Django имеет возможность кеширования файлов Sitemap, что полезно в том случае, если на сайте присутствуют десятки тысяч ссылок.

С точки зрения текущего состояния сайта EVILEG COM будет сформировано три файла Sitemap, которые будут вложены в один главный:

  • Основной Sitemap с постоянными страницами и главной страницей сайта;
  • Sitemap разделов;
  • Sitemap статей.

Настройка settings.py

Для начала настроим конфигурационный файл сайта, чтобы была возможность работать с файлами Sitemap.

SITE_ID = 1

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

SITE_ID необходим дя идентификации ресурса в базе данных. Если не будет добавлен данный параметр, то в админке сайта не получится прописать url вашего сайта, для которого делается Sitemap . Карта сайта для поисковиков просто не будет формироваться тогда. После того, как настройка сайта появится в админке, тогда нужно будет прописать домен вашего сайта, иначе в Sitemap url будут начинаться с example.com .

Что касается INSTALLED_APPS , то тут всё должно быть понятно. Первый модуль отвечает за работу с sitemaps, а второй модуль отвечает непосредственно за работу с параметром SITE_ID в базе данных.

Настройка urls.py основного приложения сайта

Говоря про основное приложение, я подразумеваю то приложение, в папке которого находится файл settings.py. В текущей реализации сайта все url Sitemap описаны в файле urls.py как раз этого самого основного приложения всего сайта.

Давайте разберёмся, что и за что отвечает.

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'),
]

Статический Sitemap

Для начала разберёмся со статическим Sitemap, который означает, что в нём будут перечислены страницы наподобие страницы контактов, главной страницы, предложений и т.д. В моём случае он располагается в приложении home.

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)

Модель Section

Для того, чтобы сформировать url-ки Sitemap из Модели необходимо, чтобы в данной модели присутствовал метод get_absolute_url. И вообще рекомендую добавить этот метод пораньше, поскольку им очень удобно пользоваться как в шаблонах, так и любом другом месте кода.

Я оставлю только необходимое для формирования Sitemap в данной модели, чтобы не загромождать код.

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})

Как видите, в модели содержится часть адреса раздела, который подставляется в шаблон 'knowledge:section'

Модель Article

Здесь тоже самое, что и с разделами за исключением того, что добавлен ArticleManager , который подменяет собой objects , чтобы расширить комплект методов, например методом article_status , по которому забираются только те статьи, которые уже опубликованы. И именно этот метод вместо метода all , вы можете увидеть в файле urls.py при формировании карт статей.

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})

Для Django рекомендую VDS-сервера хостера Timeweb .

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
m
  • moreSpb
  • 18 марта 2024 г. 15:32

C++ - Тест 003. Условия и циклы

  • Результат:85баллов,
  • Очки рейтинга6
в

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
l

C++ - Тест 005. Структуры и Классы

  • Результат:91баллов,
  • Очки рейтинга8
Последние комментарии
k
kmssr8 февраля 2024 г. 18:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 1:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 10:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 8:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 21:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
P
Pisych27 февраля 2023 г. 4:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 11:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCT27 декабря 2023 г. 8:57
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
Дмитрий10 января 2024 г. 4:18
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii Legotckoi12 декабря 2023 г. 6:48
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Следите за нами в социальных сетях