Spec-Zone.ru › Django 5.1

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

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

Обзор

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

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

Он работает очень похоже на фреймворк 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 [source]

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

items [source]

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

location [source]

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

Если это метод, он должен возвращать абсолютный путь для данного объекта, возвращаемого методом 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 [source]

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

Этот атрибут возвращает 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.

END_OF_DOCUMENT_MARKER
x_default

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

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

get_latest_lastmod() [source]

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

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

  • Если lastmod — атрибут: lastmod.
  • Если lastmod — метод: Последнее значение lastmod возвращаемое вызовом метода со всеми элементами, возвращаемыми Sitemap.items().
get_languages_for_item(item) [source]

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

Ярлыки

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

class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None) [source]

Класс django.contrib.sitemaps.GenericSitemap позволяет вам создать сайтмап, передав ему словарь, который должен содержать как минимум queryset запись. Этот набор будет использоваться для генерации элементов сайта. Также может быть запись 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, чтобы позволить более гибкую настройку шаблонов, таких как сайтмапы Google новостей. Предполагая, что items() Sitemap вернёт список элементов с publication_data и полем tags, что-то вроде этого сгенерирует совместимый с Google News sitemap:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:news="https://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.1/ref/contrib/sitemaps/

Spec-Zone.ru

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