Djangoで作ったWebサイト(Webアプリ)のサイトマップを自動生成してみましょう。
公開したWebサイト(アプリ)はGoogle Search Console に登録することでGoogleの検索結果表示にインデックスされやすくなりますが、サイトマップを作成して登録しておくことでさらにGoogleなどのロボットがページを見つけやすくなります。
Search Consoleへの登録方法や概要は下記の記事もご参照ください。
Djangoサイトを Google Search Console に登録する方法
※この記事では弊サイトの Django入門編 を終えている前提で進めます。また、機能の実装先もDjango入門編で制作した掲示板アプリをベースに進めていきます。
目次
- django.contrib.sitemapsをINSTALLED_APPSに追加
- サイトマップ用のクラスを作成
- URLconfにサイトマップを追加
- ドメインの設定
- Google Search Console にサイトマップを登録
django.contrib.sitemapsをINSTALLED_APPSに追加
Djangoには django.contrib.sitemaps というサイトマップ作成用のツールがあらかじめ用意されているのでこれを使用できるよう settings.py の INSTALLED_APPS に記述します。
INSTALLED_APPS = [ 'django.contrib.sites', # サイト管理用ツール 'django.contrib.sitemaps', # サイトマップ作成用ツール ]
django.contrib.sites はDjangoプロジェクトで複数のサイトを運用する場合に便利なツールですが、これを使用することでサイトマップに含まれる各ページのURLのドメイン部分を自動的に生成することができます。
siteフレームワークを使うので SITE_ID=1 を settings.py のどこか(どこでもいい)に記述しておきましょう。
SITE_ID = 1
これはDjangoが現在アクティブなサイトを認識するための記述です。
サイトマップ用のクラスを作成
次にサイトマップ用のクラス作成します。
サイトマップを生成したいアプリケーションのディレクトリ(ここでは入門編のアプリをベースにしているのでbbsディレクトリ)にsitemaps.pyという新しいファイルを作成し、次のように記述します。
from django.contrib.sitemaps import Sitemap from django.urls import reverse from .models import Article # サイトマップ作成に使用するモデル名 class ArticleSitemap(Sitemap): def items(self): return Article.objects.all() def location(self, item): return reverse('bbs:detail', args=[item.id])
このArticleSitemapクラスはdjango.contrib.sitemaps.Sitemapを継承します。
items()メソッドは必ず定義する必要があります。これはリストやQuerysetを返すようにし、locationやlastmodといったオプションメソッドを定義している場合、それらに1つずつ渡していきます。
location()メソッドはオプションで、各アイテムのURLをどのように生成するかを定義します。
URLconfにサイトマップを追加
新しく作成したサイトマップクラスのルーティングを設定します。
from django.contrib.sitemaps.views import sitemap from .sitemaps import ArticleSitemap # 先ほど作成したクラス名 sitemaps = { 'articles': ArticleSitemap, } urlpatterns = [ ... path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='sitemap'), ... ]
各サイトマップクラスに名前を付けてsitemapsに辞書型で追加していきます。
その後、サイトマップ用のビューをurlpatterns に追加し、この辞書を渡します。
settings.pyを変更したのでマイグレーションを行います。
python manage.py migrate
これでサイトマップ自体は生成されるようになりました。
ドメインの設定
サイトマップに含まれるURLのドメイン部分を設定しましょう。
DjangoAdminにログインし、サイトテーブルを変更します。
django.contrib.sitemaps.SitemapクラスはデフォルトでSiteオブジェクトのdomain属性を使用して、各URLのドメイン部分を生成します。
例えばこのように変更した場合、サイトマップに含まれるURLのドメイン部分は次のように出力されます。
これでサイトマップの自動生成は完了です。
Google Search Console にサイトマップを登録
最後にGoogle Search Console にサイトマップを登録しましょう。
サイトマップを登録したいサイトを選択し、メニューから「サイトマップ」を選択。
次のような画面が表示されるのでサイトマップのURLを入力し、「送信」をクリックすれば完了です!