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件の制限があるため、サイトマップをPaginatorで自動的に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しかないので、上記のようなコマンドをいくつも作っていた。