Engineer in Tokyo

Django サイトマップ フレームワーク

Django sitemap frameworkを使うのが簡単過ぎる。下記のようにサイトマップクラスを作って、urls.pyに登録するだけ。サイトマップに載るURLを取るのに、サイトマップフレームワークが自分が作ったクラスのitems()を呼び出して、アイテムのget_absolute_url()を順番に呼び出す感じ。

models.py

from django.db import models
...
class Entry(models.Model):
...
    @permalink
    def get_absolute_url(self):
        return ...
...

sitemap.py

from django.contrib.sitemaps import Sitemap
from mysite.blog.models import Entry

from django.contrib.sitemaps import Sitemap
from mysite.blog.models import Entry

class BlogSitemap(Sitemap):
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

    def lastmod(self, obj):
        return obj.pub_date

    # changefreq can be callable too
    def changefreq(self, obj):
        return "daily" if obj.comments_open() else "never"

urls.py

from mysite.blog.sitemap import BlogSitemap
...
sitemaps = {
    "blog": BlogSitemap
}
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})
...

サイトマップインデクスも作れる。GoogleのURL 50,000件の制限があるため、サイトマップをPagenatorで自動的にURLを振り分けてくれる。urls.pyをこう変えるだけ

from mysite.blog.sitemap import BlogSitemap
...
sitemaps = {
    "blog": BlogSitemap
}
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', {'sitemaps': sitemaps}),
(r'^sitemap-(?P<section>.+)\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps':sitemaps})
...

素敵だな。

後、サイトのコンテンツが変更された時、Googleが新しいコンテンツをインデクスするために ping_googleというmanage.pyコマンドが用意してある。

python manage.py ping_google

でも、他の検索エンジンが同じようなサービスがあるのに、ping_googleしかないので、上記のようなコマンドをいくつも作っていた。