【Django】docker環境で構築した静的ページ(SSL)のサイトマップを作成する方法


Dockerコンテナで構築したDjangoのWebサイトにおいて静的ページのサイトマップを作成したのでまとめます。

Docker上の環境でDjangoのWebサイトを構築する手順は以下のページを参考にしてください。

【docker-compose】Django+PostgreSQL+Nginxを連携した構築手順(CentOS8+VPS環境)

2020年5月2日

Docker環境で構築した【Django】の静的ページ(SSL)のサイトマップを作成する手順

Webサーバを構築する上で重要になるのが「サイトマップ」です。
そもそも、サイトマップとはサイト全体のページ構成を一覧表示で記載しているページで、htmlやxml形式で表示することができます。

サイトマップを作成することで、ユーザーやGoogleなどの検索エンジンにWebサイトの全体構成をわかりやすく伝えることができ、インターネット上で認識されることが早くなりSEO効果にも役立ちます。

今回は静的ページに対するサイトマップの作成手順をまとめています。
対象となる静的ページは以下のURLとなります。

https://test.engineers-life.com/test1/

また、設定・編集するファイルは全て「Djangoプロジェクト配下のファイル」を編集します。

プロジェクト配下の「settings.py」で「sitemap」アプリを追加

サイトマップを作成する際は、まずはプロジェクト配下の「settings.py」を編集します。

$ vim mysite/settings.py

「INSTALLED_APPS」に以下でハイライトしたアプリを追加します。
また、サイトマップIDをsettings.pyのどこで良いですが(私は最後に記載)記載をします。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'django.contrib.sitemaps',
    'myhp',
]

------中略------

# sitemap
SITE_ID = 1


migrate実施

上記を設定後、migrateコマンドを実施します。
今回はDocker上でDjangoを構築しているので「docker-compose run xxx 」を頭につけて実行します。

以下のコマンドは、「docker-compose.yml」に記載されている「Webサービス名」となります。
詳細は上記で作成の仕方をリンクしているので確認ください。

$ docker-compose run web python manage.py migrate
Starting postgres ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, myhp, sessions, sites
Running migrations:
  Applying sites.0001_initial... OK
  Applying sites.0002_alter_domain_unique... OK
$ 

Django管理画面から対象のドメインを編集 ※追加で設定すると「SITE_ID」の変更が必須!

次に管理画面「https://xxxxxx.com/admin」へアクセスすると「サイト」と言う項目が追加されているので、クリックし編集画面に切り替えます。

ここで注意しておくことは、前述で記述した「SITE_ID」を「1」として設定をしています。
編集するサイトのURLはIDが「1」となりますので、デフォルトで表示されている「examle.com」自体を編集します。

もし、追加でURLを追加した場合、そのURLのSITE_IDは「2」となります。
IDの確認の仕方は以下の画面のURLより赤枠の箇所を確認してください。

プロジェクト配下の「urls.py」を編集

次に静的ページを読み込むために「urls.py」を編集します。

$ vim mysite/urls.py

from django.contrib import admin
from django.urls import path, include

from django.contrib.sitemaps.views import sitemap
from .sitemaps import StaticViewSitemap

sitemaps = {
    'static': StaticViewSitemap,
}

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myhp.urls', namespace='sitemap')),
    path('sitemap.xml/', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
]     

6−7行目でsitemapと静的ページ(static)を読み込み

sitemaps = {
    'static': StaticViewSitemap,
}

path('sitemap.xml/', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),

を追加します。

さらに今回は以下のページをサイトマップとして表示するので

https://test.engineers-life.com/test1/

15行の本サイトのルートに「namespace」として「sitemap」を追記します。

プロジェクト配下に「sitemaps.py」を新規作成

次にプロジェクト配下で新規に「sitemaps.py」を作成します。

$ vim mysite/sitemaps.py

今回はSSLで構築しているサイトなので7行目でプロトコルを「https」として指定
10行目でurls.pyで「namespace」で記載した「sitemap」と対象のページ「test1」を記述します。

from django.contrib import sitemaps
from django.urls import reverse

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.5
    changefreq = 'weekly'
    protocol = 'https'

    def items(self):
        return ['sitemap:test1']

    def location(self, item):
        return reverse(item)
                            

サイトマップ設定後も「migrate」実施

上記設定後、再度migrateコマンドを実行します。
以下の様にエラーが発生せず正常に完了したことを確認します。

$ docker-compose run web python manage.py migrate
Starting postgres ... done
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, sites
Running migrations:
  No migrations to apply.

これで、静的ページのサイトマップの作成は以上となります。
以下にアクセスするとサイトマップが作成されていることがわかります。

hhttps://test.engineers-life.com/sitemap.xml/

Googleにサイトのページ作成・変更をした際のPingを送信

サイトマップを作成し、サイトが更新されるたびに変更をしたことをGoogleに知らセル場合は「Ping」コマンドを実行します。

python manage.py ping_google/sitemap.xml

通常は上記のコマンドを実行しますが、この環境はDockerコンテナで構築している環境なので以下のコマンドを実行します。

$ docker-compose run web python manage.py ping_google /sitemap.xml
Starting postgres ... done
$ 

エラーが発生せず完了できればOKです。

Dockerコンテナ上で構築した静的ページのサイトマップを作成する手順は以上となります。


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!