Зачем нужны карта сайта и лента
Поисковый робот ходит по ссылкам, поэтому глубокие и новые страницы находятся не сразу. sitemap.xml — явный список URL. RSS/Atom-лента отдаёт тот же контент в машиночитаемом виде. Всё это в Django даёт django.contrib.
| Инструмент | Адрес | Для кого |
|---|---|---|
Sitemap | /sitemap.xml | поисковые роботы |
Feed | /feeds/rss/ | читалки и агрегаторы |
| robots.txt | /robots.txt | все роботы |
Настройка
Добавьте в INSTALLED_APPS приложения django.contrib.sites, django.contrib.sitemaps и django.contrib.syndication, задайте SITE_ID = 1. Без sites Django использует хост текущего запроса, но с sites домен хранится в одном месте.
# settings.py
INSTALLED_APPS = [
# ...
"django.contrib.sites",
"django.contrib.sitemaps",
"django.contrib.syndication",
"blog",
]
SITE_ID = 1⚠️ После
migrateзаписьSiteпо умолчанию —example.com. Замените её на реальный домен в админке или shell:Site.objects.update(domain="example.org", name="Example").
Класс Sitemap
У модели должен быть get_absolute_url(). Метод items() у Sitemap отдаёт объекты, lastmod() — дату изменения.
# blog/models.py
from django.db import models
from django.urls import reverse
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
body = models.TextField()
published = models.BooleanField(default=False)
published_at = models.DateTimeField(null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse("blog:post-detail", kwargs={"slug": self.slug})# blog/sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from .models import Post
class PostSitemap(Sitemap):
changefreq = "weekly"
priority = 0.8
protocol = "https"