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