1. 開発環境のセットアップ
Djangoアプリケーション開発を始める前に、適切な環境を準備することが重要です。特に、プロジェクトごとに独立した仮想環境を構築することで、依存関係の競合を防ぎ、プロジェクトの管理を容易にします。
1.1 仮想環境の作成
プロジェクト専用のPython仮想環境を作成します。ここではvirtualenvwrapperを使用する例を示します。
mkvirtualenv myproject-env
workon myproject-env
これにより、myproject-envという名前の仮想環境が作成され、アクティブ化されます。
1.2 必須ライブラリのインストール
Djangoプロジェクトの基盤となるライブラリと、RESTful APIを構築するために広く利用されるDjango REST Frameworkをインストールします。
pip install django==3.2.2 djangorestframework
データベースコネクタの選択
MySQLデータベースを使用する場合、適切なPythonコネクタが必要です。主な選択肢はmysqlclientとpymysqlです。
- mysqlclient: C言語で書かれたMySQLライブラリのラッパーで、高いパフォーマンスが期待できますが、環境によってはインストールが難しい場合があります。
- pymysql: 純粋なPython実装で、インストールが容易です。Djangoのバージョンによっては、明示的に登録する必要があります。
# mysqlclient をインストールする場合
pip install mysqlclient
# pymysql をインストールする場合 (インストール後、Djangoに登録が必要)
pip install pymysql
pymysqlを使用する場合、Djangoプロジェクトが起動時にそれを認識するように、設定ファイルに以下の行を追加します。これは通常、プロジェクトのメイン設定ファイル(例: settings/__init__.pyまたはsettings/dev.py)の先頭付近に記述します。
# pymysql を MySQLdb として登録
import pymysql
pymysql.install_as_MySQLdb()
2. Djangoプロジェクトの初期化
仮想環境がアクティブな状態で、新しいDjangoプロジェクトを作成します。まず、プロジェクトのファイルを格納するルートディレクトリを作成し、その中に移動します。
mkdir my_django_backend
cd my_django_backend
次に、Djangoの管理コマンドを使用してプロジェクトを生成します。
django-admin startproject backend_api
このコマンドにより、backend_apiという名前のディレクトリが作成され、その中にDjangoプロジェクトの基本ファイル(manage.py、backend_api/ディレクトリなど)が配置されます。
PyCharmなどのIDEでプロジェクトを開く際は、作成した仮想環境がプロジェクトのインタープリタとして正しく設定されていることを確認してください。
3. プロジェクト構造の再編成
大規模なプロジェクトや、より整理されたコードベースを目指す場合、初期のDjangoプロジェクト構造を調整することが推奨されます。これにより、設定の分離、アプリケーションコードの一元化、およびメンテナンス性の向上が図れます。
3.1 推奨されるディレクトリ構造
以下に、再編成後の推奨ディレクトリ構造の例を示します。これにより、開発環境と本番環境で異なる設定を容易に切り替えられるようになります。
my_django_backend/
├── logs/ # アプリケーションのログファイルを格納
├── manage.py # プロジェクト管理用スクリプト
├── backend_api/ # メインDjangoアプリケーションディレクトリ
│ ├── apps/ # 各サブアプリケーションのコードを格納
│ │ ├── users/ # 例: ユーザー管理アプリケーション
│ │ ├── products/ # 例: 商品管理アプリケーション
│ │ └── ...
│ ├── libs/ # 共通で利用する外部ライブラリやカスタムパッケージ
│ ├── settings/ # プロジェクト設定ファイルを格納
│ │ ├── __init__.py # settingsパッケージの初期化
│ │ ├── base.py # 全環境共通の設定
│ │ ├── dev.py # 開発環境固有の設定
│ │ └── prod.py # 本番環境固有の設定
│ ├── urls.py # プロジェクト全体のURLルーティング
│ └── utils/ # 複数のアプリで利用される共通ユーティリティ関数
└── scripts/ # デプロイや運用のためのスクリプト
この構造では、settings/ディレクトリ内に複数の設定ファイルを配置し、apps/ディレクトリ内にすべてのカスタムアプリケーションを整理します。
3.2 設定ファイルパスの更新
ディレクトリ構造を変更した場合、Djangoがどの設定ファイルをロードすべきかを知るために、manage.pyとwsgi.py内のDJANGO_SETTINGS_MODULE環境変数を更新する必要があります。
manage.pyの変更 (開発時)
manage.pyは開発時に使用されるため、dev.pyを指すように変更します。
# manage.py
import os
import sys
# ... 他のコード ...
# 変更前: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend_api.settings')
# 変更後:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend_api.settings.dev')
# ... 他のコード ...
wsgi.pyの変更 (本番環境デプロイ時)
wsgi.pyは本番環境でアプリケーションをデプロイする際に使用されるため、prod.pyを指すように変更します。
# wsgi.py
import os
from django.core.wsgi import get_wsgi_application
# 変更前: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend_api.settings')
# 変更後:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend_api.settings.prod')
application = get_wsgi_application()
3.3 PyCharmでの起動エラー「CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False」への対処
PyCharmでプロジェクトを起動する際に、DEBUGがFalseであるにもかかわらずALLOWED_HOSTSが設定されていないというエラーが発生することがあります。これは、PyCharmの実行設定がDJANGO_SETTINGS_MODULE環境変数を正しく認識していない場合に起こり得ます。
この問題を解決するには、PyCharmの「Run/Debug Configurations」で、プロジェクトの実行設定に明示的にDJANGO_SETTINGS_MODULEを設定します。
- PyCharmのメニューから「Run」->「Edit Configurations...」を選択します。
- 左側のリストから該当するDjango実行設定を選択します。
- 「Environment variables」セクションに、
DJANGO_SETTINGS_MODULE=backend_api.settings.devを追加します。(開発環境の場合) - 設定を保存し、再度アプリケーションを起動します。
これにより、PyCharmが正しい設定ファイルをロードするようになり、ALLOWED_HOSTSに関するエラーが解消されます。
4. サブアプリケーションの作成と登録
Djangoでは、プロジェクトを論理的な機能単位に分割するために「アプリケーション(App)」を使用します。新しいアプリケーションは、上記で定義したapps/ディレクトリ内に作成することが推奨されます。
4.1 アプリケーションの生成
apps/ディレクトリ内に新しいアプリケーションを作成するには、manage.pyコマンドを使用し、作成先のディレクトリを指定します。
# プロジェクトのルートディレクトリ (例: my_django_backend) にいる場合
python manage.py startapp core_app backend_api/apps/core_app
このコマンドは、core_appという名前のアプリケーションをbackend_api/apps/ディレクトリ内に作成します。
4.2 アプリケーションの登録とパス設定
作成したアプリケーションをDjangoプロジェクトで利用可能にするには、いくつかの設定が必要です。
アプリケーションのAppConfig名の調整
各アプリケーションにはapps.pyファイルがあり、その中にAppConfigクラスが定義されています。このクラスのname属性を、Djangoがアプリケーションを正しく見つけられるように変更することが推奨されます。例えば、backend_api/apps/core_app/apps.pyは以下のようになります。
# backend_api/apps/core_app/apps.py
from django.apps import AppConfig
class CoreAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'backend_api.apps.core_app' # ここを修正
Python検索パスの設定
Djangoがapps/ディレクトリ内のアプリケーションを直接インポートできるように、プロジェクトのルート設定ファイル(例: backend_api/settings/base.py)にapps/ディレクトリをPythonの検索パス(sys.path)に追加します。
# backend_api/settings/base.py
from pathlib import Path
import os
import sys
# プロジェクトのベースディレクトリ (backend_apiの親ディレクトリ)
BASE_DIR = Path(__file__).resolve().parent.parent.parent
# 'apps' ディレクトリをPythonの検索パスに追加
apps_path = os.path.join(BASE_DIR, 'backend_api', 'apps')
sys.path.insert(0, apps_path)
# プロジェクトのメインアプリケーションディレクトリ (backend_api) も追加しておくと便利
# これにより、settingsなどのパッケージを直接インポートできるようになります
project_root_app_path = os.path.join(BASE_DIR, 'backend_api')
sys.path.insert(0, project_root_app_path)
INSTALLED_APPSへの登録
最後に、作成したアプリケーションをINSTALLED_APPSリストに追加します。AppConfigの完全修飾パスを使用します。
# backend_api/settings/base.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# カスタムアプリケーション
'backend_api.apps.core_app.apps.CoreAppConfig',
# 他のアプリケーションも同様に追加
# 'backend_api.apps.other_app.apps.OtherAppConfig',
]
IDEでのインポート警告の解消
PyCharmなどのIDEでは、apps/ディレクトリ内のアプリケーションから直接モデルやビューをインポートする際に「Unresolved reference」のような警告が表示されることがあります。これは通常、プロジェクトのソースルートが正しく設定されていないことが原因です。
これを解決するには、PyCharmの「Settings/Preferences」->「Project: [プロジェクト名]」->「Project Structure」で、backend_api/appsディレクトリを「Sources Root」としてマークします。これにより、IDEがカスタムアプリケーションのモジュールを正しく解決できるようになります。
5. 地域設定と国際化 (i18n)
Djangoプロジェクトの地域設定(ロケール)と国際化(i18n)を設定することで、管理画面の表示言語やタイムゾーンを調整できます。
backend_api/settings/base.py(またはdev.py)に以下の設定を追加または変更します。
# backend_api/settings/base.py または dev.py
# 管理画面の表示言語を日本語に設定
LANGUAGE_CODE = 'ja'
# プロジェクトのタイムゾーンをアジア/東京に設定
TIME_ZONE = 'Asia/Tokyo'
# 国際化を有効にする
USE_I18N = True
# 地域化を有効にする
USE_L10N = True
# タイムゾーンのUTC使用を無効にする (データベースにローカルタイムを保存する場合などに設定)
USE_TZ = False
これらの設定を適用すると、Django管理画面や日付/時刻表示が日本の慣習に合うように変更されます。