技術トピックは久しぶりです。
Djangoでサイトマップを作った時のメモを載せたいと思います。
サーチコンソールではサイトのsitemap.xmlを登録(Googleさんに通知)することで、Googleからのクロール速度を早めることができます。
それにより、通常(何もしない)より早く検索結果のインデックスに登録される、というわけです。
今回は、Djangoプロジェクトにおいて、どのようにsitemap.xmlを動的生成させるかということに主眼をおいたメモです。
settings.py に以下を追加します。
INSTALLED_APPS = (
....
'django.contrib.sites',
'django.contrib.sitemaps',
)
当サイトの場合、
ドメイン名: 4to.pics
表示名: 4to.pics
のように設定します。
SITE_ID = 1
格納する場所はアプリケーションの直下、models.pyとかviews.pyが置かれているところに設置すればよいでしょう。
from django.contrib.sitemaps import Sitemap # sitemapアプリのインポート
from .models import *
# 略式で書いています。python的には、必要なモデルを一つずつ列挙していくのが推奨されていると思いますが
# ここでは省略します。
class IndexSitemap(Sitemap):
def items(self):
return ['top']
def location(self, obj):
return '/'
IndexSitemapというclassをまず設定してやります。文字通り、サイトトップとなる箇所です。
itemsのreturn ['top']は、なんでもいいです。ただの名前です。笑
トップページだよ、と明示的に示したかったのでそう指定しました。
locationのreturn '/'は、サイトマップさんに、このIndexSitemapクラスはサイトのルートパスを指定しますよ、という設定です。
ブログの記事など、動的に生成されるページに関しては、以下のようにしてやります。
sitemaps.py
class BlogDetailSitemap(Sitemap):
def items(self):
return Blog.objects.all()
# この行を追記
from django.core.urlresolvers import reverse
...
...
class Blog(models.Model):
subject = models.CharField(max_length=255)
content = models.TextField(blank=False)
is_publish = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
...
# ここを追記
# BlogDetailはurls.pyのurl_patternsで指定した個別記事URLのnameを指定する
# url(r'^blog/post/(?P<pk>\d+)$', views.BlogDetailView.as_view(), name='BlogDetail')
def get_absolute_url(self):
return reverse('BlogDetail', kwargs={'pk': self.id})
from mySite import sitemaps as mysm # mySiteはアプリケーション名、先ほど作ったsitemaps.pyの読み込み
from django.contrib.sitemaps.views import sitemap
sitemaps = {
'index': mysm.IndexSitemap,
'blog': mysm.BlogDetailSitemap,
}
その後、urlpatternsにサイトマップ用のパスを指定してあげます。どんな名前でもいけますが、素直にsitemap.xmlとしましょう。
urlpatterns = [
...
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://127.0.0.1:8000/</loc>
</url>
<url>
<loc>http://127.0.0.1:8000/blog/post/1</loc>
</url>
<url>
<loc>http://127.0.0.1:8000/blog/post/2</loc>
</url>
<url>
<loc>http://127.0.0.1:8000/blog/post/3</loc>
</url>
</urlset>
長くなりましたが、今回は以上です。
現状だと、まだsitemap.xmlが動的生成されただけで、Googleへの通知はサーチコンソールから手動で行う必要があります。
DjangoのsitemapsアプリケーションにはGoogleに自動的に通知してくれる機能も備えていますので、
そちらは改めて紹介できればと思います。
新しい記事へ
来週末は一時帰国
古い記事へ
最近欲しい本
mac に pip をインストールする
mac は標準で python が入っていますが、パッケージ管理の pip がインストールされていないので入れてみました。
2017/05/26 09:00
[GAS] Google Drive の特定フォルダ配下のフォルダ・ファイルの権限を一括で移譲する
Google Drive の特定フォルダ配下のファイル・フォルダの権限を一括で移譲するツールを Google Apps Script で作りました。
2018/11/10 15:54
[Windows] Ophcrack を使ってユーザーパスワードを解析する方法
家族で使っていた Windows7 のログインパスワードを忘れたため、Ophcrack を使って解析したときの記録です。
2017/09/30 21:00
[shell] フォルダ内にある大量の ZIP ファイルをまとめて解凍する
とある ZIP を解凍すると中に大量の ZIP が居たときに幸せになれるコマンドを紹介します
2018/06/19 23:45
[MySQL] データファイルから DB を復元する
先日 MySQL が再起動できなくなる問題が発生し、急遽データファイル(.frm, .ibd)から復元しました
2018/11/25 12:44