Добавление карты сайта

⏱ 20 мин · 🧩 заданий: 5

Что такое карта сайта

Sitemap — XML-файл со списком страниц сайта для поисковых систем. В нём указаны адреса, дата последнего изменения, частота обновления и приоритет:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://myblog.ru/blog/2026/10/25/moj-post/</loc>
    <lastmod>2026-10-25</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
</urlset>

Django генерирует такой файл автоматически.

Подключение фреймворков sites и sitemaps

INSTALLED_APPS = [
    ...
    "django.contrib.sites",
    "django.contrib.sitemaps",
]

SITE_ID = 1
python manage.py migrate

Фреймворк sites хранит домен сайта (таблица django_site). Карте сайта он нужен, чтобы строить абсолютные адреса.

Класс карты сайта

blog/sitemaps.py:

from django.contrib.sitemaps import Sitemap

from .models import Post


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

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

    def lastmod(self, obj):
        return obj.updated
  • items() — какие объекты попадут в карту;
  • адрес каждого объекта берётся из get_absolute_url() (можно переопределить метод location());
  • lastmod() — дата изменения;
  • changefreq и priority — подсказки поисковикам (можно сделать и методами).

Маршрут

mysite/urls.py:

from django.contrib.sitemaps.views import sitemap

from blog.sitemaps import PostSitemap

sitemaps = {
    "posts": PostSitemap,
}

urlpatterns = [
    path("admin/", admin.site.urls),
    path("blog/", include("blog.urls", namespace="blog")),
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

Откройте http://127.0.0.1:8000/sitemap.xml.

Домен сайта

В ссылках вы увидите example.com — это домен по умолчанию. Откройте админку → «Сайты» и измените домен на свой (localhost:8000 для разработки, myblog.ru — для продакшена).

Карта для статических страниц

from django.urls import reverse


class StaticViewSitemap(Sitemap):
    priority = 0.5

    def items(self):
        return ["about", "contacts"]

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


sitemaps = {"posts": PostSitemap, "static": StaticViewSitemap}

Бонус: RSS-лента

Раз уж мы заботимся о читателях — добавим RSS. В Django есть фреймворк syndication.

blog/feeds.py:

import markdown
from django.contrib.syndication.views import Feed
from django.template.defaultfilters import truncatewords_html
from django.urls import reverse_lazy

from .models import Post


class LatestPostsFeed(Feed):
    title = "Мой блог"
    link = reverse_lazy("blog:post_list")
    description = "Новые посты моего блога."

    def items(self):
        return Post.published.all()[:5]

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return truncatewords_html(markdown.markdown(item.body), 30)

    def item_pubdate(self, item):
        return item.publish

blog/urls.py:

from .feeds import LatestPostsFeed

urlpatterns = [
    ...
    path("feed/", LatestPostsFeed(), name="post_feed"),
]

Ссылка в base.html: <a href="{% url 'blog:post_feed' %}">RSS</a>. Подробнее о лентах — в последнем модуле.

Отдайте карту поисковикам

Добавьте в корень сайта robots.txt со строкой Sitemap: https://myblog.ru/sitemap.xml и укажите карту в Яндекс Вебмастере и Google Search Console.

Итог

  • django.contrib.sites + django.contrib.sitemaps + SITE_ID = 1.
  • Класс Sitemap с items(), lastmod(), changefreq, priority.
  • Маршрут sitemap.xml с view sitemap и словарём карт.
  • Домен для абсолютных ссылок задаётся в админке «Сайты».

Практика решено 0 из 5

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Несколько вариантов

Какие приложения нужно добавить в INSTALLED_APPS для карты сайта?

Задание 2 Написать код

Напишите класс PostSitemap (наследник Sitemap): changefreq = "weekly", priority = 0.9, метод items возвращает Post.published.all(), метод lastmod(obj) — obj.updated.

Задание 3 Один вариант ответа

Откуда Sitemap берёт адрес каждого объекта по умолчанию?

Задание 4 Написать код

Подключите карту сайта в mysite/urls.py: маршрут sitemap.xml, view sitemap из django.contrib.sitemaps.views, словарь {"sitemaps": sitemaps} третьим аргументом и имя django.contrib.sitemaps.views.sitemap.

Задание 5 Один вариант ответа

Сайт на домене myblog.ru, а в sitemap.xml ссылки вида http://example.com/blog/.... Что нужно исправить?

Войдите, чтобы отмечать пройденные уроки.