Django

投稿日:2020-01-5 19:00:58

更新日:2020-01-13 17:42:58

Djangoアプリのデプロイ準備(settings分割,logging,sitemap)

X.はじめに

2020年1月に当ブログを公開させていただきましたYamataと申します。

自分も初めてのWeb開発だったため、初心者向けにDjangoを用いた開発のノウハウを発信・共有できたらと思います。

当面の記事としては今回公開に至るまでのデプロイ作業を詳しく伝えていけたらと思います。

ご質問・ご指摘等ございましたら、コメントを残していただけますと幸いです。

1.settings.pyを本番向けに

settings.pyを開発環境用と本番環境用で分割する手法を取りました。

また、Djangoに用意されているlogging機能の設定も行っています。

1-1.settings.pyの分割

settings.pyを開発環境用と本番環境用に分割することで、管理しやすくなるとともに本番デプロイ時のミスを減らすことができます。

以下ではdjango-project-siteディレクトリ下でdjango-admin startproject config .でプロジェクトを開始したものを初期状態としています。

初期状態

django-project-site
|--config
|  |--__init__.py
|  |--settings.py
|  |--urls.py
|  |--wsgi.py

分割後

django-project-site
|--config
|  |--__init__.py
|  |--settings
|  |  |--__init__.py
|  |  |--base.py
|  |  |--development.py
|  |  |--production.py
|  |--urls.py
|  |--wsgi.py

分割手順

1.configディレクトリ下にsettingsディレクトリを作成

2.settings.pyをsettingsディレクトリ下に移動

3.settings.pyの名称をbase.pyに変更

4.settingsディレクトリ下に__init__.pyを作成(空のファイルでOK)

5.settingsディレクトリ下にdevelopment.py(開発環境用)とproduction.py(本番環境用)を作成

6.base.py,development.py,production.pyをそれぞれ以下のように修正

django-project-site/config/settings/base.py (コメント部分のみ修正対象、開発と本番で分離する定義は削除)

import os

#デフォルトの1つ上の階層を参照(settingsディレクトリを作成したため)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

INSTALLED_APPS = [
    (省略)
]

MIDDLEWARE = [
    (省略)
]

ROOT_URLCONF = 'config.urls'

TEMPLATES = [
    (省略)
]

WSGI_APPLICATION = 'config.wsgi.application'

DATABASES = {
    (省略)
}

AUTH_PASSWORD_VALIDATORS = [
    (省略)
]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_URL = '/static/'

MEDIA_URL = '/media/'

django-project-site/config/settings/development.py (新規作成)

#共通の定義をbase.pyからimport
from .base import *

#開発用なので適当に記述
SECRET_KEY = 'secret_key'

#DebugはTrueとする
DEBUG = True

#空とする(全アクセスを許容)
ALLOWED_HOSTS = []

#プロジェクトのルートディレクトリ直下にmediaディレクトリを設定
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

django-project-site/config/settings/production.py (新規作成)

#共通の定義をbase.pyからimport
from .base import *

#乱数等をsecret_keyに指定
SECRET_KEY = 'xxxx'

#DebugはFalseとする
DEBUG = False

#自分のサーバのhost名・ipアドレスを指定(特定のアクセスのみ許容)
ALLOWED_HOSTS = ['yamata.tech' ,'xxx.xxx.xxx.xxx']

#以下のパスをstaticディレクトリに指定
STATIC_ROOT = '/usr/share/nginx/html/static'

#以下のパスをmediaディレクトリに指定
MEDIA_ROOT = '/usr/share/nginx/html/media'

7.manage.pyを以下のとおり修正

django-project-site/manage.py

(省略)
#manage.pyが読み込むデフォルトのsettingsをdevelopment.py(開発用)とするように変更
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.development')
(省略)

8.wsgi.pyを以下のとおり修正

django-project-site/config/wsgi.py

(省略)
#wsgi.pyが読み込むデフォルトのsettingsをproduction.py(本番用)とするように変更
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')
(省略)

1-2.logの設定

Djangoに用意されているlogging機能を使いサーバ上のlogファイルに出力できるよう設定しました。

本番用のsettingsであるproduction.pyに以下のような記述をすることでlog出力が可能となります。(他にも細かい設定が可能です。)

loggingに関する詳しい内容は別の記事で書けたらと思います。

django-project-site/config/settings/production.py

(省略)
#自分のサーバのhost名・ipアドレスを指定(特定のアクセスのみ許容)
ALLOWED_HOSTS = ['yamata.tech' ,'xxx.xxx.xxx.xxx']

#ログ設定を追加(追記部分)
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S",
        },
    },
    'handlers': {
        'file': {
            'class': 'logging.FileHandler',
            #logを置くサーバのパスを指定
            'filename': '/var/log/yamata/yamata-tech.log',
            'formatter': 'standard',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
        },
        #自分が作成したアプリを指定
        'myAppBlog': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
    },
}

#以下のパスをstaticディレクトリに指定
STATIC_ROOT = '/usr/share/nginx/html/static'
(省略)

2.sitemapの生成準備

Djangoに標準で用意されているsitemap生成機能によりXML形式のsitemapを生成するための準備をします。

生成されたsitemapをGoogleに送信することで、WebサイトがGoogle検索結果に表示されるまでの時間短縮に繋がったりします。

2-1.settingsへの設定追加

settingsのbase.py(共通設定)にアプリとSITE_IDを追加します。

django-project-site/config/settings/base.py

(省略)

INSTALLED_APPS = [
    (省略)
    #追加
    'django.contrib.sites',
    'django.contrib.sitemaps',
    (省略)
]

(省略)

#追加
SITE_ID = 1

(省略)

2-2.sitemap.pyの作成

自身のWebページの構成を伝えるための元となるsitemap.pyを作成します。

自分は以下のディレクトリにsitemap.pyを配置しました。(アプリ単位に作成する場合もあるみたいですが、プロジェクトで1つとしたかったためここに配置しています。)

django-project-site
|--config
|  |--sitemaps.py <- 追加
|--myAppBlog
|  |--models
|  |  |--post.py

作成時の注意点としてPythonの仕様で上位ディレクトリを参照するimport(from ..myAppBlog.models.post import Post)ができないため、コメント部分でプロジェクトルートディレクトリをpathに追加しimportを可能としています。

StaticSitemapクラスは静的ページ(記事一覧など)の定義、PostSitemapクラスはmodelに紐付く動的なページ(記事など)の定義を行っています。(Sitemapを継承していればクラス名はなんでもOK)

sitemapについても詳しい説明は別の記事で取り上げたいと思っています。

django-project-site/config/sitemaps.py

from sys import path
from pathlib import Path

from django.contrib.sitemaps import Sitemap
from django.shortcuts import resolve_url

#django-project-siteのpathを追加
path.append(str(Path('__file__').resolve().parent.parent))
from myAppBlog.models.post import Post


class StaticSitemap(Sitemap):
    """
    静的ページのサイトマップを定義
    """
    changefreq = 'daily'
    priority = 0.4

    def items(self):
        return ['myAppBlog:index']

    def location(self, obj):
        #静的ページのURLを生成
        return resolve_url(obj)


class PostSitemap(Sitemap):
    """
    Postページのサイトマップを定義
    """
    changefreq = 'never'
    priority = 0.8

    def items(self):
        #公開記事のみ取得
        return Post.objects.get_public()

    def location(self, obj):
        #pkをもとに動的ページのURLを生成
        return resolve_url('myAppBlog:post', pk=obj.pk)

    def lastmod(self, obj):
        return obj.createdAt

2-3.urls.pyへの設定追加

config配下のurls.pyへ以下の追加を行います。

django-project-site/config/urls.py

(省略)

from django.contrib.sitemaps.views import sitemap

from .sitemaps import StaticSitemap, PostSitemap

#追加
sitemaps = {
    'static': StaticSitemap,
    'post': PostSitemap,
}

urlpatterns = [
    (省略)
    #追加
    path('sitemap.xml/', sitemap, {'sitemaps': sitemaps}, name='sitemap'),
]

(省略)

2-4.sitemap.xmlの確認

python manage.py migrateを実行すると、サイトテーブルが作成されsitemap.xmlの確認が可能となります。

サーバを立ち上げ、127.0.0.1:8000/sitemap.xml/にアクセスすると以下のような表示がされます。

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://example.com/blog/</loc>
<changefreq>daily</changefreq>
<priority>0.4</priority>
</url>
<url>
<loc>http://example.com/blog/1/</loc>
<lastmod>2020-01-05</lastmod>
<changefreq>never</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://example.com/blog/2/</loc>
<lastmod>2020-01-05</lastmod>
<changefreq>never</changefreq>
<priority>0.8</priority>
</url>
</urlset>

サイトテーブルを作成した直後ではドメインがexample.comとなっているので、本番デプロイ時には管理画面から自身が取得したドメインに更新してあげる必要があります。

X.おわりに

拙い文章をここまで読んでいただきありがとうございます。

分かりにくいところや間違っているところがありましたら、コメントやTwitterで知らせていただけますと助かります。

まだまだデプロイ作業は残っているので、記憶が新しいうちに投稿できるよう頑張ります。

参考サイト

1-1.settings.pyの分割

[Django] プロジェクト構成のベストプラクティスを探る - 2.設定ファイルを本番用と開発用に分割する

Djangoの設定ファイルを開発用と本番用に分割する

1-2.logの設定

CentOS7+Nginx+GunicornでDjangoを起動

2-1.settingsへの設定追加 等

Djangoでサイトマップを作成してGoogleに送信する

Djangoで、サイトマップを自動生成する

コメントはこちらから

Comments

  • Качественно и по разумной цене сделаем ремонт в Туле - AprilBem

    2020-06-21 05:00

    [url=https://vk.com/jkh_service]ремонт однокомнатной квартиры[/url]

  • ЖКХ-Сервис выполняет ремонт ванной под ключ - Margietepay

    2020-06-20 23:34

    [url=https://clck.ru/P7WQ7]ванна эконом ремонт[/url]

  • Типография в москве недорого - TonyaAvedo

    2020-06-20 04:58

    [url=https://clck.ru/P5Vt8]календари изготовление типография[/url]

  • Наша типография работает для Вас в режиме 24/7 - TonyaAvedo

    2020-06-15 04:49

  • Типография офсетная и цифровая печать - Nancyevops

    2020-06-14 19:34

    Заказывали памятные календари для выпускников нашей школы, приглашения, блокноты и другую сувенирную печатную продукцию. Все понравилось, качество отличное плюс скорость исполнения.


    [url=https://asteyaplus.ru/production/booklets/]изготовление брошюр буклетов[/url]

  • Замена батареи дома отопление - Stephentog

    2020-06-14 02:19

    Выполняем ремонт квартир, коттеджей, таунхаусов под ключ в Туле.


    [url=http://xn--24-dlcleol3che2b.xn--p1ai/]общий ремонт квартир[/url]

  • Любой тираж печатаем за 72 часа - KarinAppor

    2020-06-7 12:51

    [url=https://asteyaplus.ru/production/poster-printing/]изготовление блокнотов с перфорацией[/url]

  • Китай реализует в Пакистане собственный План Маршалла. - Jamesrek

    2020-05-31 02:45

    Знаете ли вы?
    Перечень имён может быть самостоятельным поэтическим жанром.
    Вместо Плещеева озера Пётр I мог построить потешный флот на озере Неро.
    Бывший наркокурьер, став премьер-министром Юкона, принимал законы против наркомании и наркоторговли.
    Российских легкоалетов могут сурово наказать за действия чиновников от спорта.
    Согласно мифу, Марута Сар пыталась примирить Арарат и Арагац, но не смогла.


    [url=http://0pb8hx.com/]http://0pb8hx.com/[/url]

  • plusportogruaro.it - leonie saint dp - BobbyExode

    2020-05-29 18:41

    Your Personal Superhero.Stepsister gets pov fuck.Blonde Blowjob Queen Eventually Offers Her Pussy.Cute Teen Boys.fat gays gay gays gay massage gay small cocks gay.Deux hommes sont l pour combler une brunette.Now Playing Tumor stopped RIT diving coach s Olympic dreams, but couldn t keep him from the sport.Sexu anal for an aussie.Eskimo style exotics from the North, westernized metropolitan girls who are all about glamour and so many rural farm girls who want to help you stay warm through the long winters.Piper Perri Surrounded.It is one of the hottest things to imagine and see.In handcuffs and a gas mask.
    Braces Headgear Porn photos
    Popular italian photos
    Japanese nurse titts porn clips
    italian star selen in porncinema sofia 1
    italian pornostar gang bang audition swallowing cum 1
    Popular japanese photos
    XXX Cute teen Megan toy pussy 8 79 Free Movie
    Julia boin oppai japanese father6 XXNX


    PornPros Mia Scarlett Gives Lewd Lap Dance For Thick Cock.The wildest zoo fuck session ever.Astonishing porn movie Toy amateur wild.Emilys Extreme Bdsm And Pussy Punishment Of Hardcore Masochist In Severe.Empflix babysitter punished anal for stealing kinky birthday desires.Landon has fun while girlfriend is away.They perform crazy sex scenes for all tastes.Schoolgirl Is Giving A Deep.UNDER THE SKIRT UPSKIRTS.Busty masseuse gives couple nuru massage.New vid for you, younger BBC bf on vacation punishes BBW.Gay Xxx The Furry Daddy Is In Need Of Some Rump To Fuck, And The Man Is.A Naughty Nurse Doctor Dominate A Patient s Ass.com from the top to bottom and enjoy all of those awesome leggy babes.Rimjob Porn Videos.Enjoy the sensual massage category here on PornDig.
    https://krent.vn/best-amateur-anal-photo-of-all-time/
    http://hepimizmeryemiz.com/adult-pics/top-97-anal-queen-porn-stars/
    http://bagfacts.ca/cgallby-busty-spandex-milf-anal-fucked-sex-photo/
    http://arvandazin.com/cgallby-bbw-italian-amateur/
    http://www.cecaapv.org/free-anal-teens-porn-pictures-4/
    http://cfdiran.com/free-fat-beautiful-1-93-sex-photo/
    http://ab-ab.ru/monica-roccaforte-64-photos/
    http://alnama.net/realty/hardcore-anal-porn-gall/
    http://ktoplus.com/top-11-nastiest-dirtiest-hardcore-pornstars/
    http://khoorjin.com/unbelievably-busty-russian-pornstar-toying/


    plusportogruaro.it - mature gay solo assisertion
    plusportogruaro.it - lovely milf caress hunky guy huge cock
    plusportogruaro.it - sailor take her cousins cock and banged
    plusportogruaro.it - sexy videos paly 3g
    plusportogruaro.it - lavinia morales
    a06_d92