.. _ref-contrib-sitemaps: ======================= sitemaps フレームワーク ======================= :revision-up-to: 11321 (1.1) .. module:: django.contrib.sitemaps :synopsis: Google サイトマップ XML ファイルを生成するためのフレームワー クです。 Django には、 `サイトマップ`_ XML ファイルを簡単に生成できる高水準 のサイトマップ生成フレームワークが付属しています。 .. _sitemap: http://www.sitemaps.org/ .. _`サイトマップ`: `sitemap`_ 概要 ==== サイトマップ (sitemap) とは、自分のサイト上のページの更新頻度や特定のペー ジ間の「重要度」を検索エンジンのインデクサに対して知らせるために、Web サイ ト上に配置する XML ファイルです。この情報があると、検索エンジンがサイトのイ ンデクスを生成するときに役立ちます。 Django のサイトマップフレームワークを使うと、この XML ファイルの情報を Python コードで表現でき、ファイルの生成を自動化できます。 sitemaps は Django の :ref:`配信フレームワーク ` によく似ています。サイトマップの生成は簡単で、ただ :class:`~django.contrib.sitemaps.Sitemap` クラスを書いて、 :ref:`URLconf ` に指定するだけです。 インストール ============ sitemaps アプリケーションは以下の手順でインストールします: 1. :setting:`INSTALLED_APPS` 設定に ``'django.contrib.sitemaps'`` を加 えます。 2. :setting:`TEMPLATE_LOADERS` 設定に、 ``'django.template.loaders.app_directories.load_template_source'`` が入っているか確かめます。デフォルトの設定ファイルには入っているので、 注意が必要なのは設定を変更している時だけです。 3. :mod:`sites フレームワーク ` をインストールし ておいてください。 (注意: sitemaps アプリケーションは、データベースに何らテーブルをインストール しません。 :setting:`INSTALLED_APPS` に ``sitemaps`` を入れておかねばならな いのは、 :func:`~django.template.loaders.app_directories.load_template_source` テン プレートローダがデフォルトのテンプレートを捜し出せるようにするためです。) 初期化 ====== 自分の Django サイト上でサイトマップ生成を行わせるには、 :ref:`URLconf ` に以下の行を追加します:: (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) これで、 Django はクライアントが :file:`/sitemap.xml` にアクセスしたときに サイトマップを生成するようになります。 サイトマップファイルの名前はさして重要ではありませんが、ファイルの場所は重 要です。検索エンジンは、サイトマップ内のリンクをインデクス化する際、ファイ ルの置かれている URL レベルとその下のリンクしかたどりません。例えば、 :file:`sitemap.xml` がルートディレクトリ下にあれば、 Google はサイト上の全 ての URL を参照します。一方、サイトマップの場所が :file:`/content/sitemap.xml` であれば、 :file:`/content/` で始まる URL しか 参照しません。 ビュー関数 ``sitemap()`` には、必須の引数 ``{'sitemaps': sitemaps}`` があり ます。 ``sitemaps`` はセクションラベル (例えば ``blog`` や ``news``) を、 :class:`~django.contrib.sitemaps.Sitemap` クラス (例えば ``BlogSitemap`` や ``NewsSitemap``) に対応づける辞書にします。あるいは、 :class:`~django.contrib.sitemaps.Sitemap` クラスの *インスタンス* (例えば ``BlogSitemap(some_bar)``) でもかまいません。 Sitemap クラス ============== :class:`~django.contrib.sitemaps.Sitemap` クラスとは、サイトマップ上のエン トリの「セクション」を表現するための Python のクラスです。例えば、ある :class:`~django.contrib.sitemaps.Sitemap` クラスはブログ上の全てのエントリ を表し、別のクラスはイベントカレンダー上の全てのイベントを表現する、といっ た具合です。 最も単純化すれば、全てのセクションは :file:`sitemap.xml` という一つのファイ ルにまとめあげられることになります。とはいえ、 sitemaps フレームワークを使 えば、各セクションごとに個別のサイトマップファイルがあるようなサイトマップ インデクスを生成できます (後述の `サイトマップインデクスを生成する`_ を参照 してください)。 :class:`~django.contrib.sitemaps.Sitemap` クラスは ``django.contrib.sitemaps.Sitemap`` のサブクラスでなければなりません。クラ スはコードベースのどこに置いてもかまいません。 簡単な例 ======== ブログシステムを使っていて、 ``Entry`` というモデルがあるとしましょう。 サイトマップに全てのブログエントリへのリンクを含めたければ、サイトマップク ラスは以下のようになります:: 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 注意点: * :attr:`~Sitemap.changefreq` と :attr:`~Sitemap.priority` はクラス属性 で、それぞれ ```` および ```` エレメントに対応 しています。これらの属性は、上の例の :attr:`~Sitemap.lastmod` のよう に、メソッドとしても定義できます。 * :meth:`~Sitemap.items()` はオブジェクトのリストを返すだけのメソッドで す。このメソッドの返すオブジェクトは、サイトマップの各プロパティ (:attr:`~Sitemap.location`, :attr:`~Sitemap.lastmod`, :attr:`~Sitemap.changefreq`, :attr:`~Sitemap.priority`) に対応するメ ソッドに渡されます。 * :attr:`~Sitemap.lastmod` は Python の ``datetime`` オブジェクトを返さ ねばなりません。 * この例には :attr:`~Sitemap.location` メソッドがありませんが、自分でメ ソッドを定義して、オブジェクトの URL を指定してもかまいません。デフォ ルトでは、 :meth:`~Sitemap.location()` は各オブジェクトに対して ``get_absolute_url()`` を呼び出し、その結果を返します。 Sitemap クラスリファレンス ========================== .. class:: Sitemap ``Sitemap`` のサブクラスでは、以下のメソッドや属性を定義できます: .. attribute:: Sitemap.items **必須です。** オブジェクトのリストを返すメソッドです。フレームワー クはオブジェクトの *型* が何であるかを問いません。重要なのは、オブ ジェクトが :meth:`~Sitemap.location()`, :meth:`~Sitemap.lastmod()`, :meth:`~Sitemap.changefreq()`, :meth:`~Sitemap.priority()` といった メソッドに渡されるという点だけです。 .. attribute:: Sitemap.location **省略可能です。** メソッドまたは属性です。 メソッドとして定義する場合、 :meth:`~Sitemap.items()` の返すオブジェ クトを引数にとり、オブジェクトに対する絶対 URLの文字列を計算して返 さねばなりません。 属性として定義する場合、 :meth:`~Sitemap.items()` の返す *全てのオブジェクトに共通して* 使われる絶対 URL を表す文字列にしま す。 いずれの場合も、「絶対 URL」とは、以下の例のようにプロトコルおよび ドメイン部を含まない URLを指します: * 正しい: :file:`'/foo/bar/'` * 誤り: :file:`'example.com/foo/bar/'` * 誤り: :file:`'http://example.com/foo/bar/'` :attr:`~Sitemap.location` を指定していない場合、フレームワークは :meth:`~Sitemap.items()` の返す各オブジェクトに対して ``get_absolute_url()`` メソッドを呼び出します。 .. attribute:: Sitemap.lastmod **省略可能です。** メソッドまたは属性です。 メソッドとして定義する場合、 :meth:`~Sitemap.items()` の返すオブジェ クトを引数にとり、オブジェクトの最終更新日時を Python の ``datetime.datetime`` オブジェクトで返さねばなりません。 属性として定義する場合、 :meth:`~Sitemap.items()` の返す *全てのオブジェクトに共通して* 使われるオブジェクトの最終更新日時を Python の ``datetime.datetime`` オブジェクトで返さねばなりません。 .. attribute:: Sitemap.changefreq **省略可能です。** メソッドまたは属性です。 メソッドとして定義する場合、 :meth:`~Sitemap.items()` の返すオブジェ クトを引数にとり、オブジェクトの更新頻度を Python の文字列型で返さ ねばなりません。 属性として定義する場合、 :meth:`~Sitemap.items()` の返す *全てのオブジェクトに共通して* 使われるオブジェクトの更新頻度を Python の文字列型で返さねばなりません。 メソッド、属性を問わず、 :attr:`~Sitemap.changefreq` の値は以下のい ずれかにします: * ``'always'`` * ``'hourly'`` * ``'daily'`` * ``'weekly'`` * ``'monthly'`` * ``'yearly'`` * ``'never'`` .. method:: Sitemap.priority **省略可能です。** メソッドまたは属性です。 メソッドとして定義する場合、 :meth:`~Sitemap.items()` の返すオブジェ クトを引数にとり、オブジェクトの重要度 (priority) を Python の文字 列型か浮動小数型で返さねばなりません。 属性として定義する場合、 :meth:`~Sitemap.items()` の返す *全てのオブジェクトに共通して* 使われるオブジェクトの重要度を Python の文字列型か浮動小数型で返さねばなりません。 :attr:`~Sitemap.priority` の値は ``0.4`` や ``1.0`` のようにします。 デフォルトの重要度は ``0.5`` です。重要度の詳細は `sitemaps.org のドキュメント`_ を参照してください。 .. _sitemaps.org documentation: http://www.sitemaps.org/protocol.html#prioritydef .. _`sitemaps.org のドキュメント`: `sitemaps.org documentation`_ ショートカット ============== sitemaps フレームワークでは、よく使われる状況向けに、二つの便宜クラスを用意 しています: .. class:: FlatPageSitemap :class:`django.contrib.sitemaps.FlatPageSitemap` クラスは、現在の :setting:`SITE_ID` (:mod:`sites のドキュメント ` 参照) 向けの全ての :mod:`フラットページ ` を 検索し、サイトマップのエントリを生成します。各エントリには :attr:`~Sitemap.location` 属性だけが設定され、 :attr:`~Sitemap.lastmod`, :attr:`~Sitemap.changefreq`, :attr:`~Sitemap.priority` は設定されません。 .. class:: GenericSitemap :class:`django.contrib.sitemaps.GenericSitemap` クラスは任意の `汎用ビュー ` と組み合わせて使えます。 :class:`~django.contrib.sitemaps.GenericSitemap` を使うには、汎用ビュー に渡すのと同じ :data:`info_dict` を :class:`~django.contrib.sitemaps.GenericSitemap` に渡してインスタンスを 生成します。 :data:`info_dict` には少なくとも :data:`queryset` がなけれ ばなりません。また、 :data:`info_dict` に :data:`queryset` で取り出され るオブジェクトの日時のフィールドを指定する :data:`date_field` エントリ がある場合、サイトマップ生成時にエントリの :attr:`~Sitemap.lastmod` 属 性に使われます。 :class:`~django.contrib.sitemaps.GenericSitemap` のコ ンストラクタには、 :attr:`~Sitemap.priority` や :attr:`~Sitemap.changefreq` といったキーワード引数も指定できます。 これらの引数の値は、全ての URL に共通の属性になります。 例 ---- :class:`~django.contrib.sitemaps.FlatpageSitemap` と :class:`~django.contrib.sitemaps.GenericSitemap` の両方を組み込んだ :ref:`URLconf ` の例は以下のようになります:: 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('', # info_dict を使った汎用ビューの設定 # ... # サイトマップ (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}) ) .. URLconf: ../url_dispatch/ サイトマップインデクスを生成する ================================ sitemap フレームワークには、個々のサイトマップファイルを参照するサイトマッ プインデクスを生成する機能もあります。サイトマップインデクスからサイトマッ プファイルへの参照は、 :data:`sitemaps` 辞書に定義されている各セクションご とにひとつづつ作成されます。サイトマップインデクスを使うには、少しだけやり 方を変えます: * URLconf に、 :func:`django.contrib.sitemaps.views.index` と :func:`django.contrib.sitemaps.views.sitemap` という二つのビューを使 います。 * :func:`django.contrib.sitemaps.views.sitemap` にキーワード引数 :data:`section` を指定します。 上の例にならうと、URLconf は以下のようになります:: (r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}), (r'^sitemap-(?P
.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}), この設定では、 :file:`sitemap-flatpages.xml` と :file:`sitemap-blog.xml` へ の参照が入った :file:`sitemap.xml` が自動生成されます。 :class:`~django.contrib.sitemaps.Sitemap` クラスと :data:`sitemaps` 辞書に 手を加える必要はありません。 50,000 以上の URL を含むサイトマップの場合、インデクスファイルを生成せねば なりませんが、 Django は自動的にサイトマップをページ分割し、インデクスにそ の内容を反映します。 Google に ping を打つ ===================== サイトマップの変更時に、Google に「ping を打」って、サイトのインデクスを再 構築させたい場合もあるでしょう。 sitemap フレームワークで ping を打つには、 :func:`django.contrib.sitemaps.ping_google()`` を呼び出します。 .. function:: ping_google :func:`ping_google()` にはオプションの引数 :data:`sitemap_url` がありま す。この引数にはサイトのサイトマップの絶対 URL (例えば :file:`'/sitemap.xml'`)を指定します。 :data:`sitemap_url` を指定しなかっ た場合、 :func:`ping_google()` は URLconf の逆引きを行って、サイトマップ の在処を探します。 サイトマップの URL を捜し出せなかった場合、 :func:`ping_google()` は :exc:`django.contrib.sitemaps.SitemapNotFound` 例外を送出します。 .. admonition:: Google に登録しておきましょう! :func:`ping_google` が動作するのはは、 `Google Webmaster Tools`_ でサイ トを登録してある場合だけです。 .. _`Google Webmaster Tools`: http://www.google.com/webmasters/tools/ :func:`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 とはいえ、 :func:`ping_google()` は Google のサーバに HTTP リクエストを送信 するので、 ``save()`` のたびにネットワークアクセスのオーバヘッドが生じます。 もっと効率的にやりたければ、 cron 化されたスクリプトなど、一定の時点で実行 するようスケジュールしたタスクの中で :func:`ping_google()` を呼び出すとよい でしょう。 ``manage.py`` で Google に Ping を送信する ---------------------------------------------- .. versionadded:: 1.0 サイトマップアプリケーションをプロジェクトに追加したら、 ``manage.py`` コマ ンドラインインタフェースを使って、以下のように Google サーバに ping を送信 できます:: python manage.py ping_google [/sitemap.xml]