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 .