Добавление карты сайта
Что такое карта сайта
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с viewsitemapи словарём карт. - Домен для абсолютных ссылок задаётся в админке «Сайты».
Практика решено 0 из 5
Какие приложения нужно добавить в INSTALLED_APPS для карты сайта?
Напишите класс PostSitemap (наследник Sitemap): changefreq = "weekly", priority = 0.9,
метод items возвращает Post.published.all(), метод lastmod(obj) — obj.updated.
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
Откуда Sitemap берёт адрес каждого объекта по умолчанию?
Подключите карту сайта в mysite/urls.py: маршрут sitemap.xml, view sitemap из django.contrib.sitemaps.views,
словарь {"sitemaps": sitemaps} третьим аргументом и имя django.contrib.sitemaps.views.sitemap.
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",
),
]
Сайт на домене myblog.ru, а в sitemap.xml ссылки вида http://example.com/blog/.... Что нужно исправить?
Войдите, чтобы отмечать пройденные уроки.