Evgenii Legotckoi
24 сентября 2016 г. 17:55

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

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

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

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

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

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

  1. SITE_ID = 1
  2.  
  3. INSTALLED_APPS = [
  4. ...
  5. 'django.contrib.sitemaps',
  6. 'django.contrib.sites',
  7. ...
  8. ]

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

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

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

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

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

  1. from django.contrib.sitemaps import views as sitemap_views # Представление
  2. from django.contrib.sitemaps import GenericSitemap # Шаблонный класс для формирования страницы Sitemap
  3. from django.views.decorators.cache import cache_page # Декоратор кеширования
  4.  
  5. from knowledge import models as knowledge_models # Модели статей и разделов, по которым будет формироваться Sitemap
  6. from home.sitemap import HomeSitemap # Статический Sitemap для относительно постоянных страниц
  7.  
  8. # Объект карты разделов. Здесь просто забираются все объекты из базы данных,
  9. # а также по одноимённому полю в модели забирается дата последней модификации
  10. sitemap_sections = {
  11. 'queryset': knowledge_models.Section.objects.all(),
  12. 'date_field': 'section_lastmod',
  13. }
  14.  
  15. # А вот со статьями уже интереснее. Здесь забираются только те статьи, которые опубликованы
  16. # И для этого нужно будет написать специальный менеджер
  17. sitemap_articles = {
  18. 'queryset': knowledge_models.Article.objects.article_status(),
  19. 'date_field': 'article_date',
  20. }
  21.  
  22. # Формируем объект со всеми картами и присваиваем им наименования
  23. sitemaps = {
  24. 'sections': GenericSitemap(sitemap_sections, priority=0.5),
  25. 'articles': GenericSitemap(sitemap_articles, priority=0.5),
  26. 'home': HomeSitemap
  27. }
  28.  
  29. # Шаблоны URL, заметьте, здесь указано кеширование cache_page(86400)
  30. # Первый шаблон будет формировать основную карту сайта, в которой будут указаны URL дочерних,
  31. # То есть 'sitemap-sections', 'sitemap-articles', 'sitemap-home'
  32. # Заметили, что их названия перекликаются с названиями параметров в объекте sitemaps?
  33. urlpatterns += [
  34. url(r'^sitemap\.xml$', cache_page(86400)(sitemap_views.index), {'sitemaps': sitemaps}),
  35. url(r'^sitemap-(?P<section>\w+)\.xml$', cache_page(86400)(sitemap_views.sitemap), {'sitemaps': sitemaps},
  36. name='django.contrib.sitemaps.views.sitemap'),
  37. ]

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

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

  1. from django.contrib import sitemaps
  2. from django.urls import reverse # Этот метод необходим, чтобы получить url из шаблона
  3.  
  4.  
  5. class HomeSitemap(sitemaps.Sitemap):
  6. priority = 0.5 # Приоритет
  7. changefreq = 'daily' # Частота проверки
  8.  
  9. # Метод, возвращающий массив с url-ками
  10. def items(self):
  11. return ['home:index', 'home:contacts']
  12.  
  13. # Метод непосредственной экстракции url из шаблона
  14. def location(self, item):
  15. return reverse(item)

Модель Section

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

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

  1. class Section(models.Model):
  2.  
  3. ...
  4.  
  5. section_url = models.CharField('URL Раздела', max_length=50)
  6.  
  7. def get_absolute_url(self):
  8. return reverse('knowledge:section', kwargs={'section': self.section_url})

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

Модель Article

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

  1. class ArticleManager(models.Manager):
  2. use_for_related_fields = True
  3.  
  4. def article_status(self):
  5. return self.get_queryset().exclude(article_status=False)
  6.  
  7.  
  8. class Article(models.Model):
  9.  
  10. ...
  11.  
  12. article_section = models.ForeignKey(Section)
  13.  
  14. objects = ArticleManager() # объекты queryset подменяются менеджером
  15. # для расширения функционала
  16.  
  17. def get_absolute_url(self):
  18. return reverse('knowledge:article', kwargs={'section': self.article_section.section_url,
  19. 'article_id': self.id})

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь