Sitemap.xml в Django 3
Коллаж: Рыцарь с флагом и навания файлов для создания sitemap

Sitemap.xml в Django 3

20 июня 2020 г. | Веб-разработка

Автоматическое создание сайтмап приложений проекта, включающее в себя url, указывающие на динамические, статические и flatpages страницы сайта. Меняем значение протокол http на https.

1. В settings.py должно быть:

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

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        ...
	}

MIDDLEWARE = [
    …
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
]

SITE_ID = 1

Если ранее в INSTALLED_APPS не добавлялись django.contrib.sites и django.contrib.flatpages, то необходимо выполнить миграции:

python manage.py makemigrations
python manage.py migrate

Далее в админке (раздел: сайты), вместо example.com указать доменное имя.

2. Создаем в корне проекта (где расположен settings.py) файл sitemaps.py

Код для вставки:

#sitemaps.py

from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from blog.models import Post

from django.apps import apps as django_apps
from django.core.exceptions import ImproperlyConfigured

class PostSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.9

    def items(self):
        return Post.objects.all()

    def lastmod(self, obj):
        return obj.publish

class StaticViewSitemap(Sitemap):
    priority = 0.5
    changefreq = 'weekly'

    def items(self):
        return ['index']

    def location(self, item):
        return reverse(item)

class FlatPageSitemap(Sitemap):
    priority = 0.5
    changefreq = 'weekly'
    def items(self):
        if not django_apps.is_installed('django.contrib.sites'):
            raise ImproperlyConfigured("FlatPageSitemap requires django.contrib.sites, which isn't installed.")
        Site = django_apps.get_model('sites.Site')
        current_site = Site.objects.get_current()
        return current_site.flatpage_set.filter(registration_required=False)

3. В urls.py проекта добавим:

#urls.py

…
from django.conf.urls.static import static
from django.contrib.sitemaps.views import sitemap
from .sitemaps import PostSitemap, StaticViewSitemap, FlatPageSitemap

sitemaps = {
    'posts': PostSitemap,
    'static': StaticViewSitemap,
    'flatpages': FlatPageSitemap,
}

urlpatterns = [
    …
    path('', include('page.urls')),
    path('blog/', include('blog.urls')),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]

4. Результат

Запускаем сервер python manage.py и проверяем сгенерённый sitemap.xml: http://localhost:8000/sitemap.xml

5. Отладка

Редактируем sitemaps.py, шлифуя значения sitemap.xml под свои нужды. К примеру, нужно изменить значение https вместо http. Добавим во все классы файла sitemaps.py строку:

protocol = 'https'

6. Запись в robots.txt

Чтобы указать поисковым роботам путь на новоиспеченный документ, добавим запись в файл robots.txt:

Sitemap: https://yourdomain.ru/sitemap.xml
Коллаж: cимвол PostgreSql, боевой слон, фрагменты кода.

Предыдущая запись: Postgres на хостинге: установка, создание базы данных

Cамурай с мечом (Утагава Кунисада) и надписи: yii2 и htaccess

Следующая запись: .htaccess для yii2