Карта сайта представляет собой XML файл, который располагается на вашем веб сервере и сообщает поисковым движкам как часто изменяются ваши страницы и как «важны» определённые страницы по отношению к другим страницам вашего сайта. Эта информация помогает поисковым движкам индексировать ваш сайт.
Например, ниже представлена карта сайта Django (http://www.djangoproject.com/sitemap.xml):
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.djangoproject.com/documentation/</loc>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.djangoproject.com/documentation/0_90/</loc>
<changefreq>never</changefreq>
<priority>0.1</priority>
</url>
...
</urlset>
Для получения более подробной информации по картам сайтов обратитесь к http://www.sitemaps.org/.
Среда Django для генерации карты сайта автоматизирует создание
такого XML файла, позволяя вам выражать эту информацию в коде на
языке Python. Для того, чтобы создать карту сайта вам лишь надо
написать класс Sitemap и указать на него
в файле привязок URL.
Для того, чтобы установить карту сайта в ваше приложение, следуйте нижеприведённой инструкции:
Добавьте django.contrib.sitemaps в параметр конфигурации INSTALLED_APPS.
Удостоверьтесь, что django.template.loaders.app_directories.load_template_source указан в параметре конфигурации TEMPLATE_LOADERS. По умолчанию он должен там быть, только если вы его сами оттуда не убрали.
Удостоверьтесь, что вы установили sites framework FIXME (см. главу «Средства от других разработчиков»).
Замечание
Приложение для генерации карты сайта не создаёт ни одной таблицы в базе данных. Единственная причина, по которое её требуется указывать в INSTALLED_APPS — так загрузчик шаблонов load_template_source может найти стандартные шаблоны.
Для активации генератора карты сайта добавьте следующую строку в файл привязок URL:
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})
Эта строка указывает Django, что необходимо построить карту сайта, когда клиент запросит /sitemap.xml.
Имя для файла содержащего карту сайта не имеет значения, но вот расположение этого файла имеет. Поисковые движки всегда индексируют ссылки в вашей карте относительно текущего уровня URL и ниже. Например, если sitemap.xml находится в корневом каталоге сайта, он может ссылаться на любой URL вашего сайта. Однако, если карта сайта находится по URL /content/sitemap.xml, он может ссылаться на URL, начинающийся с /content/.
Представление для карты сайта принимает дополнительный
обязательный аргумент: {'sitemaps': sitemaps}. Значение sitemaps должно
быть словарём, который совпадает с сокращённой меткой
(т.е. blog или news) для своего
класса Sitemap
(т.е. BlogSitemap или
NewsSitemap). Значение может также совпадать с
экземпляром класса
Sitemap (т.е., с
BlogSitemap(some_var)).
Класс Sitemap — это обычный
Python класс, который представляет «раздел»
элементов вашей карты сайта. Например, один класс
Sitemap может представлять все записи
вашего блога, в то время как другой класс представляет все
события вашего календаря.
В простейшем случае все эти разделы объединяются в единый sitemap.xml. Также есть возможность использовать среду для генерации индекса карты сайта, который будет ссылаться на отдельные файлы карт, один файл на карту.
Классы Sitemap должны подключать
django.contrib.sitemaps.Sitemap и могут
располагаться в любом месте вашего кода.
Например, предположим, что у вас есть система ведения блогов,
использующая модель Entry. И вы желаете, чтобы
карта сайта включала все ссылки на каждую запись блога. Вот
так может выглядеть ваш класс Sitemap:
from django.contrib.sitemaps import Sitemap
from mysite.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
Объявление Sitemap должна выглядеть
подобно декларации класса Feed, таков
дизайн Django.
Подобно классам Feed, члены класса
Sitemap могут быть как методами, так и
атрибутами. Подробности были описаны в разделе «Более сложная трансляция».
Класс Sitemap может определять
следующие методы или атрибуты:
Обязательный метод items предоставляет список объектов. Среда не заботится о типах объектов. Имеет значение только то, что эти объекты передаются в методы
location(),lastmod(),changefreq()иpriority().Необязательный метод location предоставляет абсолютный URL для текущего объекта. В данном случае «абсолютный URL» означает URL, который не включает протокол и домен. Вот несколько примеров:
Хороший: /foo/var/.
Плохой: example.com/foo/bar/.
Плохой: http://example.com/foo/bar/.
Если location отсутствует, среда будет использовать метод
get_absolute_url()для каждого объекта, возвращённого методомitems().Необязательный метод lastmod возвращает дату последнего изменения объекта в виде стандартного объекта datetime.
Необязательный метод changefreq возвращает информацию о том, как часто изменяется объект. Возможные значения, определённые спецификацией на карты сайтов, представлены ниже:
always
hourly
daily
weekly
monthly
yearly
never
Необязательный метод priority возвращает приоритет между 0.0 и 1.0. Стандартный приоритет для страницы 0.5. О том как работают приоритеты можно узнать в документации на http://sitemaps.org/.
Среда генерации карты сайта поставляется с рядом удобных классов пригодных для решения общих задач. Они будут описаны дальше в этой главе.
Класс django.contrib.sitemaps.FlatPageSitemap просматривает все плоские, страницы определённые для текущего сайта и создаёт запись в карте сайта. Эти записи включают в себя только атрибут location.
Подробности о плоских страницах приведены в главе «Средства от других разработчиков».
Класс GenericSitemap работает с любым
базовым представлением (см. главу «Базовые представления»), которое у вас
есть.
Для использования этого класса, создайте его экземпляр,
передав ему такой же info_dict, какой вы
передаёте базовым представлениям. Единственное требование
заключается в том, что словарь должен иметь запись
queryset. Он также может иметь запись
date_field, которая определяет поле даты для
объектов получаемых из queryset. Дата будет
использована для атрибута lastmod при
создании карты сайта. Вы также можете передать именованные
аргументы priority и
changefreq в конструктор
GenericSitemap, для внесения этой
информации во все URL.
Ниже представлен пример файла привязок, в котором использованы FlatPageSitemap и GenericSitemap (с гипотетическим объектом Entry, о котором мы говорили ранее):
from django.conf.urls.defaults import *
from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap
from mysite.blog.models import Entry
info_dict = {
'queryset': Entry.objects.all(),
'date_field': 'pub_date',
}
sitemaps = {
'flatpages': FlatPageSitemap,
'blog': GenericSitemap(info_dict, priority=0.6),
}
urlpatterns = patterns('',
# some generic view using info_dict
# ...
# the sitemap
(r'^sitemap.xml$',
'django.contrib.sitemaps.views.sitemap',
{'sitemaps': sitemaps})
)
Среда генерации карты сайта также имеет возможность создавать индекс для карты сайта, который ссылается на отдельные файлы с картами сайта, по одному на каждую секцию определённою в словаре sitemaps. Отличия:
Вы используете два представления в вашем файле привязки: django.contrib.sitemaps.views.index и django.contrib.sitemaps.views.sitemap.
Представление django.contrib.sitemaps.views.sitemap должно принимать именованный аргумент section.
Вот так изменится предыдущий пример:
(r'^sitemap.xml$',
'django.contrib.sitemaps.views.index',
{'sitemaps': sitemaps}),
(r'^sitemap-(?P<section>.+).xml$',
'django.contrib.sitemaps.views.sitemap',
{'sitemaps': sitemaps})
Это автоматически создаст файл
sitemap.xml, который будет ссылаться на
sitemap-flatpages.xml и
sitemap-blog.xml. Классы
Sitemap и словарь
sitemaps не изменятся.
Вы можете организовать уведомление Google об изменениях в карте сайта, чтобы они знали, что надо произвести повторную индексацию вашего сайта. Среда предоставляет функцию для этого —
django.contrib.sitemaps.ping_google().
Замечание
Во время работы над этой книгой только Google откликался на уведомления. Тем не менее, есть вероятность, что Yahoo и/или MSD скоро добавят поддержку уведомлений.
В этом случае, мы наверное изменим имя функции
ping_google() на что-нибудь подобное
ping_search_engines(). Рекомендуем
периодически проверять документацию на http://www.djangoproject.com/documentation/0.96/sitemaps/.
Функция ping_google() принимает
необязательный аргумент sitemap_url, который
должен содержать абсолютный URL для карты сайта
(т.е. /sitemap.xml). Если этот аргумент опущен,
функция попытается найти карту сайта через файл привязок.
Функция ping_google() вызывает исключение
django.contrib.sitemaps.SitemapNotFound, если
она не может определить URL для карты сайта.
Ниже показан полезный способ вызова
ping_google() из метода
save() модели:
from django.contrib.sitemaps import ping_google
class Entry(models.Model):
# ...
def save(self):
super(Entry, self).save()
try:
ping_google()
except Exception:
# Простое исключение, так как мы можем получить целый
# набор исключений, относящихся к HTTP.
pass
Однако, более эффективным решением будет вызов
ping_google() из скрипта
cron или из другого периодического
процесса. Функция выполняет HTTP запрос к серверам Google и
вам может не понравится расход пропускной способности сети при
каждом вызове save().
| Пред. | Уровень выше | След. |
| Средства трансляции | Начало | Глава 12. Сессии, пользователи и регистрация |
0 comments | Make a comment