Djangoでsitemapを作成する方法【Python】

Djangoでsitemapを作成する方法【Python】

Bicepper

こんにちは!Bicepperです。

制作したWebサイトの評価をチェックしてみたりすると、「sitemapがないぞ!」と怒られたりしますよね。

今回は、Python製のフレームワークであるDjangoでsitemapを自動で作成方法を紹介します!

Sitemapとは?

そもそもSitemapってなんだろ?

プログラミング初心者

そもそもSitemap(サイトマップ)とはなんでしょうか?

簡単に言えば、Webサイト全体の構成図のようなものです。

一昔前は、サイトマップそのものを一つのページとして用意していた(ユーザー向けのコンテンツとして)Webサイトも数多く存在していましたが、最近はあまり見かけなくなりました。

ユーザーはサイトマップを見なくてもそこまで問題にはなりませんが、問題になるのはクローラーです。

クローラーは人間ではありませんから、Webサイトがどのような構造になっているかを把握するにはSitemapが必要になります。

Sitemapがないと、

  • クローラーによるページの取りこぼし
  • 検索エンジンに反映されない

などのデメリットが生じてしまう可能性があります。

特にページ数が数千、あるいは数万あるような巨大なWebサイトほど、サイトマップは必要ですが、中規模、小規模でもあるにこしたことはありません。

Djangoでモデルを作成する

では早速Djangoでモデルを作成していきましょう。

今回はブログのモデルを例にしていきます。

models.py

from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _


class BlogPost(models.Model):
    author = models.ForeignKey('auth.User', blank=False, on_delete=models.CASCADE, verbose_name=_('作成者'))
    title = models.CharField(_('タイトル'), max_length=100, blank=False)
    created_date = models.DateTimeField(_('作成日'), default=timezone.now, blank=False)

    class Meta:
        verbose_name = _('投稿')
        verbose_name_plural = _('投稿')
        ordering = ['-created_date']

    def __str__(self):
        return self.title

settings.pyに追記する

次に、settings.pyINSTALLED_APPSに以下のように追記します。

settings.py

DJANGO_APPS = [
    ...
    'django.contrib.sites',  # ←追加
    'django.contrib.sitemaps',  # ←これも一緒に追加
    ...
]

# sitemap用
SITE_ID = 1  # ←追加

urls.pyに追記する

次に、urls.pyにsitemapのURLを以下のように追記します。

urls.py

from django.contrib import admin
from django.urls import path
from django.urls import include
from django.conf import settings
from django.contrib.sitemaps import Sitemap
from django.contrib.sitemaps.views import sitemap
from django.shortcuts import resolve_url
from blog.models import(
    BlogPost
)


class BlogPostSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5
    def items(self):
        return BlogPost.objects.all()
    def location(self, obj):
        return resolve_url('blog:detail', pk=obj.pk)
...

sitemaps = {
    'blogposts': BlogPostSitemap
}
...

urlpatterns += (
    path('sitemap.xml/', sitemap, {'sitemaps': sitemaps}),
    path('', include('blog.urls')),
)

これで、http://hogehoge.com/sitemap.xmlにアクセスすれば、sitemapが取得できているのを確認できます。

クローラーにクローリングを依頼する

ここまで出来たら、あとはクローラーに依頼しましょう。
せっかくSitemapを作ってもクローラーが拾ってくれなくては意味がありません。

クローラーに依頼する方法はいくつかありますが、今回は手っ取り早くできるping_googleコマンドを利用します。

以下のコマンドを入力すればOKです。

python manage.py ping_google /sitemap.xml

Bicepper

Djangoで簡単にSitemapが作れましたね!