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

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

Обзор

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

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

Он работает так же, как структура синдикации Django . Чтобы создать карту сайта, напишите Sitemapкласс и укажите на него в своем URLconf .

Установка

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

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

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

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

views.sitemap( запрос , карты сайта , 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}sitemapsblognewsSitemapBlogSitemapNewsSitemapSitemapBlogSitemap(some_var)

Sitemapклассы

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

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

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()каждый объект и возвращает результат.

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

класс Sitemap

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 заголовком, который предотвратит отправку карты сайта, если она не изменилась.

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-адресов в карте сайта. Если он не установлен, используется протокол, с помощью которого была запрошена карта сайта. Если карта сайта создается вне контекста запроса, по умолчанию используется 'http'.

limit

По желанию.

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

i18n

По желанию.

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

languages
Новое в Django 3.2.

По желанию.

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

alternates
Новое в Django 3.2.

По желанию.

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

x_default
Новое в Django 3.2.

По желанию.

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

Ярлыки

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

classGenericSitemap ( info_dict , priority = None , changefreq = None , protocol = None )

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

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

Пример

Вот пример привязок с помощью 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'),
]

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

Часто вы хотите, чтобы сканеры поисковых систем индексировали просмотры, которые не являются ни страницами с подробными сведениями об объектах, ни плоскими страницами. Решение состоит в том, чтобы явно список имен 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( запрос , карты сайта , template_name = 'sitemap_index.xml' , content_type = 'application / xml' , sitemap_url_name = 'django.contrib.sitemaps.views.sitemap' )

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

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

from django.contrib.sitemaps import views

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

Это автоматически создаст sitemap.xmlфайл, который ссылается как на, так sitemap-flatpages.xmlи на sitemap-blog.xml. В Sitemapклассах и sitemaps ДИКТ не меняются.

Вам следует создать индексный файл, если одна из ваших карт сайта содержит более 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'),
]

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

Если вы хотите использовать разные шаблоны для каждой карты сайта или индекса карты сайта, доступного на вашем сайте, вы можете указать его, передав 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'
    }),
    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представляет собой список абсолютных URL-адресов для каждой карты сайта.

Карта сайта

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

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

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

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

alternatesАтрибут был добавлен.

itemДобавлен атрибут для каждого URL , чтобы позволить более гибкой настройки шаблонов, таких как новости Google Sitemaps . Предположим, что Sitemap items()вернет список элементов publication_dataи tagsполе, подобное этому, сгенерирует карту сайта, совместимую с 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>

Pinging Google

Вы можете захотеть «пинговать» Google, когда ваша карта сайта изменится, чтобы он знал, что нужно переиндексировать ваш сайт. Рамки Sitemaps обеспечивает функцию , чтобы сделать только что: django.contrib.sitemaps.ping_google().

ping_google( sitemap_url = Нет , ping_url = PING_URL , sitemap_uses_https = True )

ping_google принимает эти необязательные аргументы:

  • sitemap_url- Абсолютный путь к карте сайта вашего сайта (например, '/sitemap.xml'). Если этот аргумент не указан, ping_google попытается выяснить вашу карту сайта, выполнив обратный поиск в вашем URLconf.
  • ping_url- По умолчанию используется инструмент Google Ping Tool: https://www.google.com/webmasters/tools/ping .
  • sitemap_uses_https- Установите, Falseесли ваш сайт использует http вместо https.

ping_google()вызывает исключение, django.contrib.sitemaps.SitemapNotFoundесли не может определить URL вашей карты сайта.

Сначала зарегистрируйтесь в Google!

Команда ping_google()работает, только если вы зарегистрировали свой сайт в Инструментах Google для веб-мастеров .

Один из полезных способов вызова ping_google()- из save() метода модели :

from django.contrib.sitemaps import ping_google

class Entry(models.Model):
    # ...
    def save(self, force_insert=False, force_update=False):
        super().save(force_insert, force_update)
        try:
            ping_google()
        except Exception:
            # Bare 'except' because we could get a variety
            # of HTTP-related exceptions.
            pass

Однако более эффективным решением будет вызов ping_google()из сценария cron или другой запланированной задачи. Функция отправляет HTTP-запрос на серверы Google, поэтому вы можете не захотеть вводить эти сетевые накладные расходы каждый раз при вызове save().

Проверка связи с Google через manage.py

django-admin ping_google [sitemap_url]

После того, как приложение Sitemap добавлено в ваш проект, вы также можете проверить связь с Google с помощью команды ping_googleуправления:

python manage.py ping_google [/sitemap.xml]
--sitemap-uses-http

Используйте эту опцию, если ваша карта сайта использует httpвместо https.

Copyright ©2021 All rights reserved