Django

【Django×pipenv】最適なディレクトリ構造を考えてみた

この記事では、pipenvでDjangoをインストールしてからHelloWorldを表示するまでの僕が行なっている設定などを詳しく紹介していきたいと思っています。

簡単にいうと、MySQLを使うための設定、わかりやすいディレクトリ構造にする方法などを紹介できたらと思っています。

pipenvでDjango環境を構築する

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

$ mkdir djangoProject
$ cd djangoProject/

Pipfileを作成する

Pipfileとは、pipenvで管理するPythonのバージョンやインストールするライブラリを記述するファイルのことです。
RubyでいうとGemfile、PHPでいうとComposer.jsonに当たるのかなと思います。

以下のようにすることでPythonのバージョンを指定できます。

$ pipenv –python=3.7

Djangoをインストールする

GemfileやComposer.jsonと同じように、pipenv install 〜を実行すると、Pipfile.lockが生成します。

$ pipenv install django==2.2.7

(バージョンは最新を指定しています。)

Djangoでプロジェクト作成する

$ pipenv run django-admin startproject config .

おそらく他の記事だと、

$ django-admin startproject [プロジェクト名]

じゃなかった?って思うかもしれません。
しかし、このコマンドでプロジェクトを作ると、以下のようになります。

djangoProject
├── Pipfile
├── Pipfile.lock
└── プロジェクト名             #←ココ(直下にログインアプリや投票アプリなどを配置)
    ├── プロジェクト名         #←ココ(プロジェクト全体に関する設定ファイル)
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── manage.py

嫌じゃないですか??
開発していく上では、こういうところのストレスを無くしたいですね。

そこで、以下のコマンドを打ちます!

(これからDjangoのプロジェクトを作成するコマンドはこれを使って欲しいので、マーカーも引いときます!)

$ pipenv run django-admin startproject config .

ピリオド(.)を忘れないでください!
ピリオドは、カレントディレクトリを指しています。

生成したDjangoのプロジェクトは以下のようになります。

djangoProject
├── Pipfile
├── Pipfile.lock
├── config          #ここから下が生成
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

少し、幸せを感じませんか?笑

次にconfig/settings.pyを本番環境、テスト環境、開発環境にファイルを分割していきます。

confeig内のファイルについて、少しだけ簡単に説明しておくので、気になれば目を通してください。(次の作業を何のためにやるのか?が分かればOKです。)

settings.py

ファイルの中身を見ていただければ、わかるようにDjangoのプロジェクトに関する設定が色々書いてあります。

アプリケーションを追加すれば、”INSTALLED_APPS”に追加していきます。
テンプレートの設定は、”TEMPLATES”に記述していきます。
データベース設定は、”DATABASES”に書いていきます。

こんな風にプロジェクト全体に関わる設定ばかりです。

ですが、実際にデプロイしたことのある方はわかると思いますが、データベースなどは、環境ごとで異なるものを使います。
ゆえに、設定事項も異なってきます。

ファイルを分割したいですよね〜。

では、やっていきましょう!

settings.pyを環境ごとに分割する

ディレクトリ構造と変更箇所を確認する

ここまでの作業で、以下のようなディレクトリ構造になってると思います。

一旦確認してみてください。

変更前

djangoProject
├── Pipfile
├── Pipfile.lock
├── config
│   ├── __init__.py
│   ├── settings.py  #settingsディレクトリを作り、開発環境ごとにファイルを作成
│   ├── urls.py
│   └── wsgi.py
└── manage.py

上のsetting.pyというファイルがあると思います。

この部分を下のように変更します。どんなファイル名にするかは人それぞれだと思うので、変更の仕方だけわかってもらえたらと思います。

変更後

    ├── config
    │   ├── settings
    │   │   ├── __init__.py
    │   │   ├── base.py
    │   │   ├── develop.py
    │   │   ├── production.py
    │   │   └── test.py

今回は、先ほど作ったconfigディレクトリ内にsettingsというディレクトリを作って、その中に、

・base.py    → 全ての環境で共通する設定
・production.py  → 本番環境のみの設定
・develop.py  → 開発環境のみの設定
・test.py    → テスト環境のみの設定

のように分割して作っていきます。

前半戦(ディレクトリ、ファイルの作成)

settingsディレクトリを作成します。

$ mkdir settings

次に、settingsディレクトリ内に必要なファイルを生成します。
__init__.pyは、djangoにパッケージだということを認識させるためと思ってください。

(ファイルの作成には、touchコマンドを使います。)

$ touch settings/__init__.py
$ touch settings/base.py
$ touch settings/production.py
$ touch settings/test.py
$ touch settings/develop.py

そして、元からあったsettings.pyの記述をbase.pyに移行します。

$ mv config/settings.py config/settings/base.py

最後に、production.pyとdevelopment.py、test.pyにbase.pyの内容を読み込ませるための記述をする。

from .base import *

うまくできましたか?
ここまでは、ディレクトリとファイルを生成して、記述内容を写しているだけなので、コマンドを使わなくてもできるので、手動でやっても構いません。

あとは、manage.pyを変更するだけ。
もう一息です。

後半戦(ファイルの編集)

manage.py

manage.pyの以下の部分、

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

ここで、setting.pyを読み込むように指定しています。
しかし、今回の変更で、
config/setting.py → config/settings/develop.pyに変更したので、以下のように編集してください。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.develop")

config/wsgi.py

同じように、wsgi.pyは以下のように書き換えます。

wsgi.pyは本番環境で動かすファイルなので、”production”を指定します。

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')

MySQLでデータベースを構築する

mysqlclientをインストールする

$ pipenv install mysqlclient==1.4.5

config/settings/develop.pyにDB設定を記述する

from .base import *

# 以下を追加
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoProject',
        'USER': 'ユーザー名',
        'PASSWORD': 'パスワード',
    }
}

データベースを作成する

$ mysql -u root

mysql> create database djangoApp;
mysql> exit;

“root”は、ユーザー名です。

migrateを実行する

$ pipenv run python manage.py migrate

migrateは仮想環境内にあるので、仮想環境内で実行します。

以下に仮想環境内で実行するための2つのコマンドを簡単に書いているので、確認してみてください。

お疲れ様でした、これで完了です!

以下のコマンドで、http://127.0.0.1:8000/にアクセスできれば成功です。

$ pipenv run python manage.py runserver

やっておくと便利な細かい設定2つ

日本語設定

Django内での日本語設定をしておきます。

これをやっておくと、datetimeモジュール(現在の時刻などを取得できる)などで、日本の時刻を取得できます。

変更する箇所は、base.pyのみです。以下のように変更してください。
(base.pyの下の方にあります。)

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

以下のコマンドでサーバーを立ち上げ、表示された画面が日本語になっていれば成功です。

$ pipenv run python manage.py runserver

コマンドの簡略化

ここでは、コマンドの簡略化を行なっていきます。

編集するファイルは、Pipfileだけです、以下を追記してください。

[scripts]
serve = "python manage.py runserver"

これで、以下のように短いコマンドで実行することができるようになりました。

$ pipenv run python manage.py runserver

$ pipenv run server

例えば、こんな感じで。(参考)

[scripts]
server = "python manage.py runserver"
shell = "python manage.py shell"
makemigrations = "python manage.py makemigrations"
sqlmigrate = "python manage.py sqlmigrate"
migrate = "python manage.py migrate"
showmigrations = "python manage.py showmigrations"
check = "python manage.py check"
createsuperuser = "python manage.py createsuperuser"

最後に出来上がったディレクトリ構造を書いておきます、確認してみてください。

Django ディレクトリ構造 ベストプラクティス、などで検索すると他の記事でもたくさん紹介してあるので、調べてみてください。

最終的なディレクトリ構造

djangoProject
├── Pipfile
├── Pipfile.lock
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── develop.py
│   │   ├── production.py
│   │   └── test.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

うまくいきましたか?
引き続き、chatアプリの作成に移っていきます。(現在作成中。。。)

COMMENT

メールアドレスが公開されることはありません。