Spec-Zone.ru › Django 5.2

Фреймворк для создания карты сайта

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

Обзор

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

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

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

Установка

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

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

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

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

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

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

from django.contrib.sitemaps.views import sitemap

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

Это сообщает Django построить карту сайта, когда клиент обращается к /sitemap.xml.

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

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

Классы карт сайта

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

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

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

Пример

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

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 объектов. Возвращаемые объекты будут переданы в любые вызываемые методы, соответствующие свойству карты сайта (location, lastmod, changefreq и priority).
  • lastmod должен возвращать datetime.
  • В этом примере нет метода location, но вы можете его указать, чтобы указать URL для вашего объекта. По умолчанию location() вызывает get_absolute_url() для каждого объекта и возвращает результат.

Справочник по классам карт сайта

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'.

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() [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() в сгенерированной карте сайта.

Аргументы ключевых слов 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",
    ),
]

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

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

# 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",
    ),
]

Создание индекса карты сайта

views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.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 не изменяются.

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

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

Если вы не используете стандартное представление карты сайта (например, если оно обернуто декоратором кэширования), вы должны дать имя своему представлению карты сайта и передать 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. Предполагая, что 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="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.2/ref/contrib/sitemaps/

Spec-Zone.ru

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