Фреймворк для карты сайта ¶
Django поставляется с высокоуровневым фреймворком для создания карты сайта для создания XML-файлов карты сайта .
Обзор ¶
Карта сайта - это файл XML на вашем веб-сайте, который сообщает индексаторам поисковых систем, как часто ваши страницы меняются и насколько «важны» определенные страницы по отношению к другим страницам вашего сайта. Эта информация помогает поисковым системам индексировать ваш сайт.
Платформа карты сайта Django автоматизирует создание этого XML-файла, позволяя выражать эту информацию в коде Python.
Он работает так же, как структура синдикации Django . Чтобы создать карту сайта, напишите
Sitemap
класс и укажите на него в своем
URLconf .
Установка ¶
Чтобы установить приложение Sitemap, выполните следующие действия:
- Добавьте
'django.contrib.sitemaps'
к своейINSTALLED_APPS
настройке. - Убедитесь, что ваш
TEMPLATES
параметр содержитDjangoTemplates
серверную часть, для которойAPP_DIRS
заданы параметрыTrue
. Он там по умолчанию, поэтому вам нужно будет изменить это только в том случае, если вы изменили этот параметр. - Убедитесь, что вы установили .
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}
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()
- это метод, который возвращает последовательность или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
.
-
Ярлыки ¶
Фреймворк карты сайта предоставляет удобный класс для общего случая:
-
class
GenericSitemap
( 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 используются два представления:
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}),
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
ключи.
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
.