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
  • molni99
  • 26 октября 2024 г. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

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

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

  • Результат:42баллов,
  • Очки рейтинга-8
Последние комментарии
i
innorwall9 ноября 2024 г. 6:03
Qt/C++ - Урок 009. QTimer или Как работать с таймером в Qt? She also saw an increase in her energy levels and improvement in her shortness of breath better business bureau online pharmacy priligy Transfection induced VEGFR2 promoter activity i…
i
innorwall9 ноября 2024 г. 5:36
Шаг 1: Настройка окружения для программирования на Python This fixed combination drug may be used as initial therapy or substituted for previously titrated doses of the individual components priligy side effects Expanded clinical phenotype o…
i
innorwall9 ноября 2024 г. 5:11
PyQt5 - Урок 003. QSystemTrayIcon - Как свернуть приложение в трей where can i buy priligy The medium was changed every three days
i
innorwall9 ноября 2024 г. 2:43
Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box) can i buy priligy in usa Reprod Biomed Online 10 3 310 319
i
innorwall9 ноября 2024 г. 2:29
EVILEG - 4 Года онлайн buy priligy Pelleted food this way of administration is less stressful for the mice, and a few vendors offer a commercially available chow
Сейчас обсуждают на форуме
i
innorwall9 ноября 2024 г. 5:44
добавить qlineseries в функции We ve got the first batch ready for clinical trials, said Ovadje priligy usa LICENSED SHOP Nolvadex
9
9Anonim25 октября 2024 г. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 14:05
Реализация навигации по разделам Спасибо Евгений!
F
Fynjy22 июля 2024 г. 14:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

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