Spec-Zone.ru › Django 1.11

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

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

Обзор

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

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

Он работает очень похоже на фреймворк для генерации RSS-лент 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

url(r'^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 классы

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

Sitemap справочник по классам

class Sitemap [source]

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

items [source]

Обязательно. Метод, возвращающий список объектов. Фреймворк не заботится о типе объектов; важно только то, что эти объекты передаются методам 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, sitemap, сгенерированный методом views.sitemap(), будет иметь заголовок Last-Modified , равный самой последней lastmod. Вы можете активировать ConditionalGetMiddleware для того, чтобы Django должным образом реагировал на запросы с заголовком If-Modified-Since и не отправлял sitemap, если он не изменился.

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

limit

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

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

i18n

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

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

Сокращения

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

class GenericSitemap [source]

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

Пример

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

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

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

urlpatterns = [
    # some generic view using info_dict
    # ...

    # the sitemap
    url(r'^sitemap\.xml$', sitemap,
        {'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}},
        name='django.contrib.sitemaps.views.sitemap'),
]

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

Часто вы хотите, чтобы поисковые роботы индексировали представления, которые не являются ни страницами деталей объектов, ни страницами flatpages. Решением является явное перечисление имен 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.conf.urls import url
from django.contrib.sitemaps.views import sitemap

from .sitemaps import StaticViewSitemap
from . import views

sitemaps = {
    'static': StaticViewSitemap,
}

urlpatterns = [
    url(r'^$', views.main, name='main'),
    url(r'^about/$', views.about, name='about'),
    url(r'^license/$', views.license, name='license'),
    # ...
    url(r'^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 = [
    url(r'^sitemap\.xml$', views.index, {'sitemaps': sitemaps}),
    url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps},
        name='django.contrib.sitemaps.views.sitemap'),
]

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

Вы должны создать файл индекса, если один из ваших 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 = [
    url(r'^sitemap\.xml$',
        cache_page(86400)(sitemaps_views.index),
        {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
    url(r'^sitemap-(?P<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 = [
    url(r'^custom-sitemap\.xml$', views.index, {
        'sitemaps': sitemaps,
        'template_name': 'custom_sitemap.html'
    }),
    url(r'^custom-sitemap-(?P<section>.+)\.xml$', views.sitemap, {
        'sitemaps': sitemaps,
        'template_name': 'custom_sitemap.html'
    }, name='django.contrib.sitemaps.views.sitemap'),
]

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

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

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

Индекс

Переменная sitemaps представляет собой список абсолютных URL-адресов каждого sitemap.

Sitemap

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

  • changefreq
  • item
  • lastmod
  • location
  • priority

Атрибут 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="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, когда ваш sitemap меняется, чтобы сообщить ему о необходимости повторного индексирования вашего сайта. Фреймворк sitemaps предоставляет функцию для этого: django.contrib.sitemaps.ping_google().

ping_google() [source]

ping_google() принимает необязательный аргумент, sitemap_url, который должен быть абсолютным путем к sitemap вашего сайта (например, '/sitemap.xml'). Если этот аргумент не указан, ping_google() попытается определить ваш sitemap, выполнив обратный поиск в вашем URLconf.

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

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

Команда ping_google() работает только в том случае, если вы зарегистрировали свой сайт в Google Webmaster Tools.

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

from django.contrib.sitemaps import ping_google

class Entry(models.Model):
    # ...
    def save(self, force_insert=False, force_update=False):
        super(Entry, self).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]

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

python manage.py ping_google [/sitemap.xml]

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

Spec-Zone.ru

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