AI can fly !!

AI がやりたい Web エンジニアのアウトプット (AI の知識は無い)

【Django3.0】開発環境構築から初期設定まで【Python3.8】

django-logo

はじめに

Django で開発を行うにあたり、開発環境の構築からプロジェクトの初期設定など、ビジネスロジックの実装以外で基本的に一度やったらそれで終わりの作業をまとめました。

「えーと、 Django のプロジェクト作るには何をすればよかったんだっけ…」「あー!あの設定漏れてた!」と、僕がなることのまとめです。

新規に Django プロジェクトとアプリケーションを作成し、開発用の Web サーバを起動して Web ブラウザに Hello Django !! と表示するところまでをまとめました。

動作環境

OS Version
Windows 10 Pro 1909
Application Version
PowerShell 5.1.18362.752
Language Version
Python 3.8.1
Package Version
Django 3.0.4

開発環境構築

まずは、必要なパッケージのインストールやプロジェクトの作成から。

Python 仮想環境作成

最初に Python の仮想環境を作成します。

python -m venv venv

インストール

次に仮想環境へ切り替えを行い、 Django をインストールします。

./venv/Scripts/activate

pip install django

プロジェクト作成

インストールが完了したら、 Django のプロジェクトを作成します。

プロジェクトディレクトリを作成する場合

django-admin startproject [project_name]

カレントディレクトリにプロジェクトディレクトリが作成され、その中に Django アプリケーションの各構成ファイルが作成されます。

カレントディレクトリ = プロジェクトディレクトリの場合

django-admin startproject [project_name] .

カレントディレクトリに Django アプリケーションの各構成ファイルが作成されます。

アプリケーション作成

次に、プロジェクトルート直下にアプリケーションを作成します。

アプリケーション作成コマンドは、プロジェクトルートで実行します。

python manage.py startapp [application_name]

Django 初期設定

開発環境の構築が完了したら、プロジェクトの初期設定を行います。

プロジェクト

Django プロジェクトに関する設定は、プロジェクトディレクトリ内の設定ファイル (settings.py) で行います。

設定ファイル (settings.py)

[project_root]/[project_name]/settings.py

言語 (LANGUAGE_CODE)

-- LANGUAGE_CODE = "en-us"
++ LANGUAGE_CODE = "ja"

タイムゾーン (TIME_ZONE)

-- TIME_ZONE = "UTC"
++ TIME_ZONE = "Asia/Tokyo"

データベース (DATABASES)

   DATABASES = {
       "default": {
--     "ENGINE": "django.db.backends.sqlite3",
--     "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
++     "ENGINE": "django.db.backends.oracle",
++     "NAME": "[host]:[port]/[db_name].[db_domain]",
++     "USER": "[user]",
++     "PASSWORD": "[password]",
    }
}

Django では複数のデータベースを公式にサポートしており、ここでは例として Oracle Database への接続方法を記載しています。

テンプレート (TEMPLATES)

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

APP_DIRSTrue にすると、各アプリケーションディレクトリ直下の templates ディレクトリ内にあるテンプレートを参照する。

APP_DIRS のデフォルト値は True なので、特に変更の必要はありません。

インストールアプリケーション (INSTALLED_APPS)

   INSTALLED_APPS = [
++     "[application_name].apps.[AppConfig]",
       "django.contrib.admin",
       "django.contrib.auth",
       "django.contrib.contenttypes",
       "django.contrib.sessions",
       "django.contrib.messages",
       "django.contrib.staticfiles",
   ]

作成したアプリケーションの AppConfigINSTALLED_APPS に追加し、アプリケーションを有効化します。

プロジェクトに含めるアプリケーションは INSTALLED_APPS に追加する必要があり、逆に言えばここに追加しなければマイグレーション等の対象にはなりません。

プロジェクト作成時に既にいくつかのアプリケーションが追加されていますが、不要なものがあれば削除しても問題ありません。

ルーティング (urls.py)

URLconf で URL パターンをビューにマッピングします。

プロジェクトルート直下の URLconf では、主に各アプリケーションの URLconf への参照設定を行います。

[project_root]/[project_name]/urls.py
   urlpatterns = [
       path("admin/", admin.site.urls),
++     path("[application_name]/", include("[application_name].urls")),
   ]

プロジェクトルートから作成したアプリケーションまでのルーティングを追加する。

アプリケーション

ここからはアプリケーションディレクトリ内の各構成ファイルについてです。

ビュー (views.py)

Django のビューは、関数ベースとクラスベース (汎用ビュー) の二種類存在しますが、ここでは関数ベースのビューを例示しています。

[project_root]/[application_name]/views.py
   from django.shortcuts import render

++ def index(request):
++     context = {"framework": "Django"}
++     return render(request, "[application_name]/index.html", context)

ビューの役割は、データベースからのデータ取得やテンプレートのロード、レンダリングしたテンプレートの返却など多岐にわたります。

主なビジネスロジックはビューに実装することになります。

テンプレート (templates ディレクトリ)

[project_root]/[application_name]/templates/[application_name]/

プロジェクト設定ファイル (settings.py) の TEMPLATES.APP_DIRSTrue にした場合、アプリケーションディレクトリ直下の templates ディレクトリ内が参照されます。

templates ディレクトリ直下にテンプレートファイルを置かず、 [application_name] ディレクトリを作成してから、その中にテンプレートファイルを配置します。

テンプレートの名前空間 - Django チュートリアルより要約

Django では名前がマッチした最初のテンプレートを使用するので、異なるアプリケーションの中に同じ名前のテンプレートがあった場合、それらを区別することができません。

templates ディレクトリ直下に [application_name] サブディレクトリを作り、その中にテンプレートファイルを配置することで、名前空間を作成することができます。

Django にはテンプレート内で使用できる独自のテンプレート言語が存在します。

ここで例示しているテンプレートは、ビューから渡されたコンテキスト変数の framework の値を展開し、レンダリングされます。

[project_root]/[application_name]/templates/[application_name]/index.html
++ <!DOCTYPE html>
++ <html lang="ja">
++ <head>
++   <meta charset="utf-8">
++   <title>Django Application</title>
++ </head>
++ <body>
++   Hello {{ framework }} !!
++ </body>
++ </html>

ルーティング (urls.py)

アプリケーション作成コマンドでは、アプリケーションディレクトリに URLconf (urls.py) は作成されないため、自分で作る必要があります。

[project_root]/[application_name]/urls.py
++ from django.urls import path

++ from . import views

++ app_name = "[application_name]"
++ urlpatterns = [
++     path('', views.index, name='index'),
++ ]

プロジェクトルートの URLconf から渡された URL パターン (URL からプロジェクトルートの URLconf で定義された URL パターンを除いた文字列) と、ビューをマッピングします。

モデル (models.py)

[project_root]/[application_name]/models.py

Django では、データベースのテーブルを Python のクラスで表現し、カラムをクラス変数として定義します。

テーブルとクラスが一対一で紐づき、これが一つのモデルとなります。

今回は Hello Django !! と表示するだけなのでモデルは必要ありませんが、モデルの簡単な書き方だけ例示します。

from django.db import models

class [class_name](models.Model):
    [column_name_1] = models.IntegerField(primary_key=True)
    [column_name_2] = models.CharField(max_length=[length])
    [column_name_3] = models.DateField()
    [column_name_4] = models.ForeignKey(
        "[other_class_name]", models.DO_NOTHING, db_column="[other_column_name]"
    )

    class Meta:
        managed = True
        db_table = "[table_name]"

既にデータベースにテーブルが存在する場合

Django には、既存のデータベースからモデルを自動生成するユーティリティが備わっています。

python manage.py inspectdb > [application_name]/models.py

inspectdb コマンドを実行すると、プロジェクト設定ファイルの DATABASES に設定されているデータベースのテーブルを読み込み、 Django モデルモジュールを標準出力に出力します。

上記の例では、 inspectdb コマンドの出力結果をリダイレクトし、直接 models.py に書き込んでいます。

マイグレーション

アプリケーションのモデルで定義した内容をデータベースに反映するために、マイグレーションを実行します。

Django では、マイグレーションの作成と適用それぞれにコマンドが用意されています。

マイグレーション作成

makemigrations コマンド

python manage.py makemigrations

# アプリケーション単位でマイグレーションファイルを作成
python manage.py makemigrations [application_name]

makemigrations コマンドを実行すると、 プロジェクト設定ファイルの INSTALLED_APPS に設定されているアプリケーションのモデルを読み込み、各アプリケーションディレクトリの migrations ディレクトリ内にマイグレーションファイルが作成されます。

マイグレーション実行

sqlmigrate コマンド

python manage.py sqlmigrate [application_name] [migration_name]

migrate コマンドを実行する前に、 sqlmigrate コマンドで実際にデータベースへ発行される SQL を確認することができます。

migrate コマンド

python manage.py migrate

migrate コマンドを実行すると、 makemigrations コマンドで作成されたマイグレーションの内容がデータベースに反映されます。

開発用サーバ

Django には、開発を迅速に行うために Python だけで書かれた軽量な Web サーバが付属しています。

サーバ起動

runserver コマンド

python manage.py runserver [port]

runserver コマンドを実行すると、 Web サーバが起動します。

引数として、ポート番号を指定することもできます。

ポート番号のデフォルト値は 8000 です。

Web ブラウザで確認

runserver コマンドで起動した Web サーバには、 http://localhost:[port] でアクセスできます。

Django の開発用サーバは、デフォルトではコードを変更して保存する度に自動リロードされる設定になっています。

http://localhost:[port]/[application_name]/ にアクセスし、 Hello Django !! と表示されれば、今回の Django アプリケーションは正常に動作しています。

おわりに

今回は、 Django プロジェクトを新規で立ち上げた際に行うことを中心にまとめました。

実際の開発では、今回取り上げなかったクラスベースの汎用ビューや、フォーム (forms.py) 、管理サイト (Django Admin) など、他にも多くの Django の機能を使用することになると思います。

さらに、 SPA (Single Page Application) との組み合わせに Django REST framework 、ソーシャルログインを実装するために social-auth-app-djangoWSGI サーバを立てるために Gunicorn など、 Django だけでなくサードパーティ製のパッケージも必要になることもあります。

覚えることが多くて大変と思いがちですが、一度覚えてしまえばアプリケーションの実装に集中できるので、やっぱりフレームワークは便利です。

というか、フレームワークを使用せずにすべてを自前で実装する方が絶対大変です…

それでは、皆様も良い Django ライフを!