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しかないので、上記のようなコマンドをいくつも作っていた。