Evgenii Legotckoi
Evgenii Legotckoi24 вересня 2016 р. 07: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 хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Г

C++ - Тест 001. Первая программа и типы данных

  • Результат:66бали,
  • Рейтинг балів-1
t

C++ - Тест 001. Первая программа и типы данных

  • Результат:33бали,
  • Рейтинг балів-10
t

Qt - Тест 001. Сигналы и слоты

  • Результат:52бали,
  • Рейтинг балів-4
Останні коментарі
G
GoattRock03 вересня 2024 р. 13:50
Як скопіювати файли в Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
Влад Русоков02 серпня 2024 р. 01:47
Як скопіювати файли в Linux Screenshot_20240802-065123.png
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
Fynjy22 липня 2024 р. 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCT25 червня 2024 р. 01:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCT05 травня 2024 р. 05:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 14:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Слідкуйте за нами в соціальних мережах