Добавление карты сайта
Django идет в комплекте с фреймворком карт сайтов, который позволяет динамически создавать карты для своего сайта.
Карта сайта – это XML-файл, который сообщает поисковым системам о страницах веб-сайта, их релевантность и частоту их обновления. Использование карты сделает сайт более заметным в рейтинге поисковых систем, поскольку она помогает поисковым роботам индексировать содержимое сайта.
Фреймворк карты сайта в Django зависит от приложения django.contrib.sites, которое позволяет ассоциировать объекты с теми или иными веб-сайтами, работающими вместе с вашим проектом. Это удобно, когда вы хотите управлять несколькими сайтами, используя один проект Django.
Для установки фреймворка карт сайтов необходимо активировать приложения sites и sitemap в своем проекте.
Отредактируйте файл settings.py проекта, добавив django.contrib.sites и django.contrib.sitemaps в настроечный параметр INSTALLED_APPS.
Кроме того, определите новый настроечный параметр для SITE_ID, как показано ниже:
SITE_ID = 1
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
'taggit',
'django.contrib.sites',
'django.contrib.sitemaps',
]
Теперь запустите следующую ниже команду из командной оболочки, что-бы создать таблицы приложения Django sites в базе данных:
python manage.py migrate
Вы должны увидеть результат, содержащий такие строки:
Теперь приложение sites синхронизировано с базой данных.
Затем внутри каталога своего приложения 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
Мы определили конкретно-прикладную карту сайта, унаследовав класс Sitemap модуля sitemaps.
Атрибуты changefreq и priority указывают частоту изменения страниц постов и их релевантность на веб-сайте (максимальное значение равно 1).
Метод items() возвращает набор запросов QuerySet объектов, подлежащих включению в эту карту сайта. По умолчанию Django вызывает метод get_absolute_url() по каждому объекту, чтобы получить его URL-адрес.
Напомним, что мы применили этот метод в разделе 6.1 "Работа с URL", чтобы формировать канонический URL-адрес постов. Если нужно указать URL-адрес каждого объекта, то в класс sitemap можно добавить метод location.
Метод lastmod получает каждый возвращаемый методом items() объект и возвращает время последнего изменения объекта. Атрибуты changefreq и priority могут быть либо методами, либо атрибутами.
С полным справочным материалом по картам сайтов можно ознакомиться в официальной документации Django на странице https://docs.djangoproject.com/en/5.0/ref/contrib/sitemaps/.
Мы создали карту сайта. Теперь необходимо создать для него URL-адрес.
Отредактируйте главный файл urls.py проекта mysite, добавив карту сайта, как показано ниже:
from django.urls import path, include
from django.contrib import admin
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')
]
В приведенном выше исходном коде были вставлены необходимые инструкции импорта и определен словарь sitemaps.
На сайте может быть определено несколько карт. Мы определили шаблон URL-адреса, который совпадает с шаблоном sitemap.xml и в котором используется встроенное в Django представление sitemap. Словарь sitemaps передается в представление sitemap.
Следующей ниже командой запустите сервер разработки и перейдите по URL-адресу http://127.0.0.1:8000/sitemap.xml в своем браузере.
Вы увидите результат в формате XML, включающий все опубликованные посты, как показано ниже:
URL-адрес каждого объекта Post формируется путем вызова его метода get_absolute_url().
Атрибут lastmod соответствует полю даты updated поста, как было указано в карте сайта, а атрибуты changefreq и priority также взяты из класса Post-Sitemap.
Для формирования URL-адресов используется домен example.com. Этот домен получен из хранящегося в базе данных объекта Site. Указанный объект был создан по умолчанию, когда вы синхронизировали фреймворк сайтов со своей базой данных.
Подробнее о фреймворке сайтов можно почитать на странице https://docs.djangoproject.com/en/5.0/ref/contrib/sites/.
Пройдите по URL-адресу http://127.0.0.1:8000/admin/sites/site/ в своем браузере. Вы должны увидеть что-то вроде этого:
На рисунке показано представление списка на сайте администрирования для фреймворка сайтов. Здесь можно задать домен или хост, который будет использоваться фреймворком сайтов и зависящими от него приложениями.
Для того чтобы сгенерировать URL-адреса, существующие в локальной среде, измените доменное имя на localhost:8000, как показано и сохраните его:
Снова пройдите по URL-адресу http://127.0.0.1:8000/sitemap.xml в своем браузере.
Теперь в отображаемых в ленте URL-адресах будет использоваться новое хост-имя, и они будут выглядеть вот так: http://localhost:8000/blog/2022/1/22/markdown-post/.
Теперь ссылки доступны в локальной среде. В производственной среде, чтобы иметь возможность генерировать абсолютные URL-адреса, придется использовать домен своего веб-сайта.