Spec-Zone.ru › Django 5.0

Структура фреймворка sitemap

Django поставляется с высокоуровневым фреймворком для генерации sitemap, предназначенным для создания XML-файлов sitemap.

Обзор

Sitemap — это XML-файл на вашем сайте, который сообщает поисковым индексаторам, как часто меняются ваши страницы и насколько «важны» определённые страницы по отношению к другим страницам на вашем сайте. Эта информация помогает поисковым системам индексировать ваш сайт.

Фреймворк Django sitemap автоматизирует создание этого XML-файла, позволяя вам выразить эту информацию на языке Python.

Он работает очень похоже на фреймворк syndication Django. Для создания sitemap напишите класс Sitemap и укажите на него в вашем URLconf.

Установка

Чтобы установить приложение sitemap, выполните следующие шаги:

  1. Добавьте 'django.contrib.sitemaps' в ваше значение настройки INSTALLED_APPS.
  2. Убедитесь, что в настройке TEMPLATES указан бэкэнд DjangoTemplates, чьи параметры APP_DIRS установлены на True. По умолчанию он включён, поэтому вам нужно будет это изменить только в случае изменения настроек.
  3. Убедитесь, что вы установили sites framework.

(Примечание: приложение sitemap не устанавливает таблиц базы данных. Единственная причина, по которой оно должно быть в INSTALLED_APPS, заключается в том, что загрузчик шаблонов Loader() может найти шаблоны по умолчанию.)

Инициализация

views.sitemap(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml')

Чтобы активировать генерацию sitemap на вашем сайте Django, добавьте эту строку в ваш URLconf:

from django.contrib.sitemaps.views import sitemap

path(
    "sitemap.xml",
    sitemap,
    {"sitemaps": sitemaps},
    name="django.contrib.sitemaps.views.sitemap",
)

Это указывает Django на построение sitemap при обращении клиента к /sitemap.xml.

Имя файла sitemap не имеет значения, но расположение имеет. Поисковые системы будут индексировать только ссылки в вашем sitemap для текущего уровня URL и ниже. Например, если sitemap.xml находится в корневом каталоге, он может ссылаться на любой URL на вашем сайте. Однако, если ваш sitemap находится по адресу /content/sitemap.xml, он может ссылаться только на URL, начинающиеся с /content/.

Метод представления sitemap принимает дополнительный обязательный аргумент: {'sitemaps': sitemaps}. sitemaps должен быть словарем, который сопоставляет краткое имя раздела (например, blog или news) с его классом Sitemap (например, BlogSitemap или NewsSitemap). Он также может сопоставляться с экземпляром класса Sitemap (например, BlogSitemap(some_var)).

Sitemap классы

Класс Sitemap — это класс Python, представляющий «раздел» записей в вашем sitemap. Например, один класс Sitemap может представлять все записи вашего блога, а другой — все события в вашем календаре событий.

В самом простом случае все эти разделы объединяются в один sitemap.xml, но фреймворк также позволяет генерировать индекс sitemap, который ссылается на отдельные файлы sitemap, по одному на каждый раздел. (См. Создание индекса sitemap ниже.)

Классы Sitemap должны быть подклассами django.contrib.sitemaps.Sitemap. Они могут находиться в любом месте вашего кода.

Пример

Предположим, у вас есть система блога с моделью Entry и вы хотите, чтобы ваш sitemap включал все ссылки на ваши отдельные записи блога. Вот как может выглядеть ваш класс sitemap:

from django.contrib.sitemaps import Sitemap
from blog.models import Entry


class BlogSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

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

Примечание:

  • changefreq и priority — это атрибуты класса, соответствующие элементам <changefreq> и <priority> соответственно. Их можно сделать вызываемыми функциями, как и lastmod в примере.
  • items() — это метод, который возвращает последовательность или QuerySet объектов. Возвращённые объекты будут переданы любым вызываемым методам, соответствующим свойству sitemap (location, lastmod, changefreq и priority).
  • lastmod должен возвращать datetime.
  • В этом примере нет метода location, но вы можете предоставить его, чтобы указать URL для вашего объекта. По умолчанию, location() вызывает get_absolute_url() для каждого объекта и возвращает результат.

Sitemap ссылка на класс

class Sitemap
END_OF_DOCUMENT_MARKER

Класс Sitemap может определять следующие методы/атрибуты:

items

Обязательно. Метод, возвращающий последовательность или QuerySet объектов. Фреймворк не заботится о типе этих объектов; важно лишь, чтобы они передавались методам location(), lastmod(), changefreq() и priority().

location

Необязательно. Метод или атрибут.

Если это метод, он должен возвращать абсолютный путь к данному объекту, как возвращает items().

Если это атрибут, его значение должно быть строкой, представляющей абсолютный путь, используемый для всех объектов, возвращаемых items().

В обоих случаях «абсолютный путь» означает URL без протокола и домена. Примеры:

  • Хороший: '/foo/bar/'
  • Плохой: 'example.com/foo/bar/'
  • Плохой: 'https://example.com/foo/bar/'

Если location не указан, фреймворк вызовет метод get_absolute_url() для каждого объекта, возвращённого items().

Чтобы указать протокол, отличный от 'http', используйте protocol.

lastmod

Необязательно. Метод или атрибут.

Если это метод, он должен принимать один аргумент – объект, возвращаемый items() – и возвращать дату/время последнего изменения этого объекта как datetime.

Если это атрибут, его значение должно быть datetime, представляющим дату/время последнего изменения всех объектов, возвращаемых items().

Если у всех элементов в картах сайта есть lastmod, карта сайта, сгенерированная views.sitemap(), будет иметь заголовок Last-Modified равный последней lastmod. Вы можете активировать ConditionalGetMiddleware, чтобы Django корректно реагировал на запросы с заголовком If-Modified-Since, что предотвратит отправку карты сайта, если она не изменилась.

paginator

Необязательно.

Этот атрибут возвращает Paginator для items(). Если вы генерируете карты сайта по частям, вам может потребоваться переопределить его как кэшируемый атрибут, чтобы избежать многократных вызовов items().

changefreq

Необязательно. Метод или атрибут.

Если это метод, он должен принимать один аргумент – объект, возвращаемый items() – и возвращать частоту обновления этого объекта как строку.

Если это атрибут, его значение должно быть строкой, представляющей частоту обновления всех объектов, возвращаемых items().

Возможные значения для changefreq (при использовании метода или атрибута):

  • 'always'
  • 'hourly'
  • 'daily'
  • 'weekly'
  • 'monthly'
  • 'yearly'
  • 'never'
priority

Необязательно. Метод или атрибут.

Если это метод, он должен принимать один аргумент – объект, возвращаемый items() – и возвращать приоритет этого объекта как строку или число с плавающей точкой.

Если это атрибут, его значение должно быть строкой или числом с плавающей точкой, представляющим приоритет всех объектов, возвращаемых items().

Примеры значений для priority: 0.4, 1.0. По умолчанию приоритет страницы 0.5. См. документацию sitemaps.org для получения дополнительной информации.

protocol

Необязательно.

Этот атрибут определяет протокол ('http' или 'https') URL-адресов в карте сайта. Если он не задан, используется протокол, с которым был запрошен сайт. Если карта сайта создаётся вне контекста запроса, по умолчанию используется 'https'.

Изменено в Django 5.0:

В более старых версиях по умолчанию для карт сайта, созданных вне контекста запроса, был протокол 'http'.

limit

Необязательно.

Этот атрибут определяет максимальное количество URL-адресов на каждой странице карты сайта. Его значение не должно превышать значение по умолчанию 50000, которое является максимальным значением, разрешённым в протоколе карт сайта.

i18n

Необязательно.

Булевый атрибут, определяющий, должны ли URL-адреса этой карты сайта генерироваться, используя все ваши LANGUAGES. По умолчанию False.

languages

Необязательно.

Последовательность кодов языка для генерации альтернативных ссылок, когда включен i18n. По умолчанию LANGUAGES.

alternates

Необязательно.

Булевый атрибут. При использовании совместно с i18n сгенерированные URL-адреса будут содержать список альтернативных ссылок на другие языковые версии, используя атрибут hreflang. По умолчанию False.

x_default

Необязательно.

Булевый атрибут. При включении True альтернативные ссылки, сгенерированные alternates, будут содержать запись hreflang="x-default" по умолчанию со значением LANGUAGE_CODE. По умолчанию False.

get_latest_lastmod()

Необязательно. Метод, возвращающий последнее значение, возвращенное lastmod. Эта функция используется для добавления атрибута lastmod к переменным контекста индекса Sitemap.

По умолчанию get_latest_lastmod() возвращает:

  • Если lastmod является атрибутом: lastmod.
  • Если lastmod является методом: Последнее значение lastmod , возвращенное после вызова метода со всеми элементами, возвращенными Sitemap.items().
get_languages_for_item(item)
Добавлена в Django 4.2.

Необязательно. Метод, возвращающий последовательность кодов языка, для которых отображается элемент. По умолчанию get_languages_for_item() возвращает languages.

Сокращения

Фреймворк sitemap предоставляет удобный класс для распространенного случая:

class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None)

Класс django.contrib.sitemaps.GenericSitemap позволяет создать sitemap, передав ему словарь, который должен содержать по крайней мере запись queryset. Этот набор запросов будет использован для генерации элементов sitemap. Он также может содержать запись date_field, которая определяет поле даты для объектов, полученных из queryset. Это будет использоваться для атрибута lastmod и методов get_latest_lastmod() в сгенерированном sitemap.

Ключевые аргументы priority, changefreq и protocol позволяют указать эти атрибуты для всех URL.

Пример

Вот пример URLconf, использующего GenericSitemap:

from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Entry

info_dict = {
    "queryset": Entry.objects.all(),
    "date_field": "pub_date",
}

urlpatterns = [
    # some generic view using info_dict
    # ...
    # the sitemap
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": {"blog": GenericSitemap(info_dict, priority=0.6)}},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

Sitemap для статических представлений

Часто вам необходимо, чтобы поисковые роботы индексировали представления, которые не являются страницами деталей объектов или статическими страницами. Решение состоит в явном перечислении имен URL для этих представлений в items и вызове reverse() в методе location sitemap. Например:

# sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse


class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.5
    changefreq = "daily"

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

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


# urls.py
from django.contrib.sitemaps.views import sitemap
from django.urls import path

from .sitemaps import StaticViewSitemap
from . import views

sitemaps = {
    "static": StaticViewSitemap,
}

urlpatterns = [
    path("", views.main, name="main"),
    path("about/", views.about, name="about"),
    path("license/", views.license, name="license"),
    # ...
    path(
        "sitemap.xml",
        sitemap,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

Создание индекса sitemap

views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.sitemap')

Фреймворк sitemap также имеет возможность создания индекса sitemap, который ссылается на отдельные файлы sitemap, по одному на каждую секцию, определенную в словаре sitemaps. Единственные отличия в использовании:

  • Вы используете два представления в вашем URLconf: django.contrib.sitemaps.views.index() и django.contrib.sitemaps.views.sitemap().
  • Представление django.contrib.sitemaps.views.sitemap() должно принимать ключевой аргумент section.

Вот как будут выглядеть соответствующие строки URLconf для приведенного выше примера:

from django.contrib.sitemaps import views

urlpatterns = [
    path(
        "sitemap.xml",
        views.index,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.index",
    ),
    path(
        "sitemap-<section>.xml",
        views.sitemap,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

Это автоматически сгенерирует файл sitemap.xml , который ссылается как на sitemap-flatpages.xml, так и на sitemap-blog.xml. Классы Sitemap и словарь sitemaps не меняются.

Если у всех sitemap возвращается значение lastmod методом Sitemap.get_latest_lastmod(), индекс sitemap будет иметь заголовок Last-Modified , равный самому позднему lastmod.

Вы должны создать файл индекса, если один из ваших sitemap содержит более 50 000 URL-адресов. В этом случае Django автоматически распределит sitemap, и индекс отразит это.

Если вы не используете стандартное представление sitemap — например, если оно обернуто декоратором кэширования — вы должны назвать ваше представление sitemap и передать sitemap_url_name в представление индекса:

from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path(
        "sitemap.xml",
        cache_page(86400)(sitemaps_views.index),
        {"sitemaps": sitemaps, "sitemap_url_name": "sitemaps"},
    ),
    path(
        "sitemap-<section>.xml",
        cache_page(86400)(sitemaps_views.sitemap),
        {"sitemaps": sitemaps},
        name="sitemaps",
    ),
]

Настройка шаблона

Если вы хотите использовать другой шаблон для каждого sitemap или индекса sitemap, доступного на вашем сайте, вы можете указать его, передав параметр template_name представлениям sitemap и index через URLconf:

from django.contrib.sitemaps import views

urlpatterns = [
    path(
        "custom-sitemap.xml",
        views.index,
        {"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
        name="django.contrib.sitemaps.views.index",
    ),
    path(
        "custom-sitemap-<section>.xml",
        views.sitemap,
        {"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

Эти представления возвращают экземпляры TemplateResponse, что позволяет легко настроить данные ответа перед рендерингом. Дополнительную информацию см. в документации TemplateResponse.

Переменные контекста

При настройке шаблонов для представлений index() и sitemap() вы можете использовать следующие переменные контекста.

Индекс

Переменная sitemaps представляет собой список объектов, содержащих атрибуты location и lastmod для каждого из sitemap. Каждый URL предоставляет следующие атрибуты:

  • location: Расположение (URL и страница) sitemap.
  • lastmod: Заполняется методом get_latest_lastmod() для каждого sitemap.

Sitemap

Переменная urlset представляет собой список URL-адресов, которые должны отображаться в sitemap. Каждый URL предоставляет атрибуты, как определено в классе Sitemap:

  • alternates
  • changefreq
  • item
  • lastmod
  • location
  • priority

Атрибут alternates доступен, когда включены i18n и alternates. Это список других версий языка, включая необязательный резервный вариант x_default для каждого URL. Каждый альтернативный вариант — это словарь с ключами location и lang_code.

Атрибут item был добавлен для каждого URL, чтобы позволить более гибкую настройку шаблонов, например, карты Sitemap для Google News. Предполагая, что items() Sitemap вернет список элементов с publication_data и полем tags, что-то вроде этого сгенерирует карту Sitemap, совместимую с Google News:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
{% spaceless %}
{% for url in urlset %}
  <url>
    <loc>{{ url.location }}</loc>
    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
    <news:news>
      {% if url.item.publication_date %}<news:publication_date>{{ url.item.publication_date|date:"Y-m-d" }}</news:publication_date>{% endif %}
      {% if url.item.tags %}<news:keywords>{{ url.item.tags }}</news:keywords>{% endif %}
    </news:news>
   </url>
{% endfor %}
{% endspaceless %}
</urlset>

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/ref/contrib/sitemaps/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API