Система карты сайта ( sitemap )

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

Предварительный просмотр

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

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

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

Установка

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

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

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

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

views.sitemap( запрос , карты сайта , section = None , template_name = 'sitemap.xml' , content_type = 'application / xml' )

Чтобы включить создание карты сайта для сайта Django, добавьте эту строку в конфигурацию URL :

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

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

Классы 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 , которое является верхним пределом, разрешенным протоколом карты сайта .

i18n

По желанию.

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

Ярлыки

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

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

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

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

Пример

Вот пример конфигурации 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 . Единственные различия в использовании заключаются в следующем:

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

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 через конфигурацию URL:

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 :

  • changefreq (частота модификации)
  • item (элемент)
  • lastmod (дата последнего изменения)
  • location (адрес)
  • priority (Приоритет)

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

Сообщить в 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 попробуйте найти саму карту сайта, выполнив обратный поиск в конфигурации URL.
  • ping_url - по умолчанию содержит ссылку на инструмент Google Ping: 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 ©2020 All rights reserved