Django プロジェクト構造解析
Django のプロジェクト構造を理解することで、コードをより効率的に整理し、Django のベストプラクティスに従い、保守しやすい Web アプリケーションを構築できます。
前の章では、次のコマンドの使い方を学びましたdjango-admin startprojectコマンドで新しいプロジェクトを作成すると、Django は以下の基本構造を自動生成します:myproject/
│
├── manage.py
└── myproject/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
django-admin を使用して HelloWorld プロジェクトを作成します:
django-admin startproject HelloWorld
作成完了後、プロジェクトのディレクトリ構造を確認してみましょう:

| ファイル/ディレクトリ | 詳細な説明 |
|---|---|
manage.py | Django プロジェクトのコマンドライン管理ツールで、django-adminの機能をカプセル化し、DJANGO_SETTINGS_MODULE環境変数を現在のプロジェクトの設定に自動的に設定します。すべてのプロジェクト管理コマンドはこれを介して実行されます。例:- runserver:開発サーバーを起動- makemigrations:データベースマイグレーションファイルを生成- shell:ORM 付きの Python シェルを起動 |
db.sqlite3 | Django がデフォルトで使用する SQLite データベースファイルで、最初にmigrateコマンドを実行すると自動生成されます。開発環境に適しています。本番環境では PostgreSQL/MySQL への変更を推奨します。ファイルの場所はsettings.py内のDATABASES['default']['NAME']で定義されます。 |
__pycache__/ | Python インタープリタが生成するバイトコードキャッシュディレクトリで、.pycファイルが含まれており、モジュールの読み込みを高速化します。バージョン管理にコミットする必要はありません(.gitignoreで無視してください)。 |

コアファイルの解析
manage.py
manage.pyは Django プロジェクトのコマンドラインツールの入り口であり、多くの便利なコマンドを提供します:
例
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# インポートエラーの処理
pass
execute_from_command_line(sys.argv)
よく使用するコマンドの例:
python manage.py runserver- 開発サーバーを起動python manage.py migrate- データベースマイグレーションを適用python manage.py createsuperuser- 管理者アカウントを作成
settings.py
settings.pyは Django プロジェクトの設定ファイルで、すべての重要な設定を含みます:
例
DEBUG = True # 開発時は True に設定し、詳細なエラーを表示。本番環境では必ず False に変更
ALLOWED_HOSTS = [] # DEBUG=False の場合は、アクセスを許可するドメインを指定する必要があります(例:['example.com'])
INSTALLED_APPS = [
'django.contrib.admin', # 管理サイト
'django.contrib.auth', # 認証システム
'django.contrib.contenttypes', # コンテンツタイプフレームワーク
'django.contrib.sessions', # セッション管理
'django.contrib.messages', # メッセージフレームワーク
'django.contrib.staticfiles', # 静的ファイル管理
# カスタムアプリケーションを追加可能:'myapp.apps.MyAppConfig'
]
DATABASES = { # データベース設定
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3', # pathlib 構文を使用
# MySQL の例:
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'mydb',
# 'USER': 'root',
# 'PASSWORD': 'password',
}
}
STATIC_URL = '/static/' # 静的ファイルの URL プレフィックス
STATICFILES_DIRS = [BASE_DIR / 'static'] # 開発時の静的ファイル検索ディレクトリ
MEDIA_URL = '/media/' # ユーザーアップロードファイルの URL プレフィックス
MEDIA_ROOT = BASE_DIR / 'media' # アップロードファイルの保存パス
urls.py(URL ディスパッチャ)
例
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), # 管理サイトのルート
path('blog/', include('blog.urls')), # サブアプリケーションのルート振り分け
# path('api/', include('api.urls', namespace='api')),
]
- include():ルーティングのモジュール化を実現し、異なるアプリケーションのルートをそれぞれの urls.py に分離します。
- namespace:URL を逆解析する際の名前衝突を避けるために使用します。
wsgi.py & asgi.py
| ファイル | 用途 |
|---|---|
wsgi.py | WSGI(Web Server Gateway Interface)設定で、従来の同期サーバー(Gunicorn、uWSGI など)に使用します。本番環境ではこのファイルを介してプロジェクトを起動します。 |
asgi.py | ASGI(Asynchronous Server Gateway Interface)設定で、非同期サーバー(Daphne、Uvicorn など)をサポートします。WebSocket や非同期ビューに使用します。 |
拡張ディレクトリ(自動生成されませんが、よく使用されます)
HelloWorld/ ├── apps/ # 推荐:存放所有自定义应用 │ └── blog/ # 示例应用 ├── static/ # 静态文件(CSS/JS/图片) ├── media/ # 用户上传文件 ├── templates/ # 全局模板目录 └── requirements.txt # 项目依赖列表
1. apps/ ディレクトリ(推奨構造)
アプリケーションを一元管理し、プロジェクトのルートディレクトリに散らばるのを防ぎます。
settings.py で Python パスを設定する必要があります:
import sys sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
2. 静的ファイルとメディアファイル
-
static/:CSS、JavaScript、画像などを格納し、STATIC_URL を介してアクセスします。
media/:ユーザーがアップロードしたファイル(例:アバター)で、MEDIA_URL を介してアクセスします。開発時にサーバーがアクセスを提供するように設定する必要があります:
# urls.py(仅开发环境) from django.conf import settings from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Django アプリケーションの構造
Django では、1つのプロジェクトに複数のアプリケーションを含めることができます。次のコマンドを使用してpython manage.py startapp myapp新しいアプリケーションを作成すると、以下の構造が生成されます:
myapp/ │ ├── migrations/ │ └── __init__.py ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── tests.py └── views.py
主要なアプリケーションファイル
models.py
データモデルを定義し、データベーステーブルに対応させます:
例
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
def __str__(self):
return self.name
views.py
ビジネスロジックを処理し、レスポンスを返します:
例
from .models import Product
def product_list(request):
products = Product.objects.all()
return render(request, 'myapp/product_list.html', {'products': products})
admin.py
Django 管理サイトを設定します:
例
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'price')
完全なプロジェクト構造の例
典型的な Django プロジェクトの完全な構造は以下の通りです:
myproject/
│
├── manage.py
├── requirements.txt
├── static/
│ ├── css/
│ ├── js/
│ └── images/
├── media/
├── templates/
│ └── base.html
└── myproject/
├── __init__.py
├── settings.py
├── urls.py
├── wsgi.py
└── asgi.py
└── myapp1/
├── migrations/
├── templates/
│ └── myapp1/
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
├── urls.py
└── views.py
└── myapp2/
└── ... (类似结构)
重要なディレクトリの説明
migrations ディレクトリ
データベースマイグレーションファイルを保存します。Django はこれらのファイルを使用してモデルの変更を追跡し、データベースに同期します。
static ディレクトリ
静的ファイル(CSS、JavaScript、画像など)を保存します。デプロイ時に指定された場所に収集されます。
templates ディレクトリ
HTML テンプレートファイルを保存します。Django はテンプレート言語を使用してページを動的に生成します。
media ディレクトリ
ユーザーがアップロードしたファイルを保存します。settings.py での設定が必要です:
例
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
実践的なアドバイス
- プロジェクトとアプリケーションの分離:各アプリケーションの独立性を維持し、再利用を容易にします
- 環境設定:異なる settings ファイルを使用して開発環境と本番環境を区別します
- 静的ファイル管理:開発時は
STATICFILES_DIRS、本番時はcollectstatic - URL 設計:アプリケーションレベルで URL を定義し、プロジェクトレベルでインクルードします
- テンプレート構成:各アプリケーションにサブディレクトリを作成してテンプレートを保存します
本番環境 vs 開発環境の違い
| ファイル/設定 | 開発環境 | 本番環境 |
|---|---|---|
DEBUG | True(エラーの詳細を表示) | False(エラーを非表示にし、ログに記録) |
| データベース | SQLite(デフォルト) | PostgreSQL/MySQL(パフォーマンス最適化) |
| 静的ファイル | runserver自動配信 | 使用してcollectstaticCDN に収集します |
ALLOWED_HOSTS | 空のリストまたは['localhost'] | ドメインの設定が必要です(例:['example.com']) |