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


コアファイルの解析

manage.py

manage.pyは Django プロジェクトのコマンドラインツールの入り口であり、多くの便利なコマンドを提供します:

例

#!/usr/bin/env python
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.contrib import admin
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.pyWSGI(Web Server Gateway Interface)設定で、従来の同期サーバー(Gunicorn、uWSGI など)に使用します。本番環境ではこのファイルを介してプロジェクトを起動します。
asgi.pyASGI(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

データモデルを定義し、データベーステーブルに対応させます:

例

from django.db import models

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 django.shortcuts import render
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 django.contrib import admin
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_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

実践的なアドバイス

  1. プロジェクトとアプリケーションの分離:各アプリケーションの独立性を維持し、再利用を容易にします
  2. 環境設定:異なる settings ファイルを使用して開発環境と本番環境を区別します
  3. 静的ファイル管理:開発時はSTATICFILES_DIRS、本番時はcollectstatic
  4. URL 設計:アプリケーションレベルで URL を定義し、プロジェクトレベルでインクルードします
  5. テンプレート構成:各アプリケーションにサブディレクトリを作成してテンプレートを保存します

本番環境 vs 開発環境の違い

ファイル/設定開発環境本番環境
DEBUGTrue(エラーの詳細を表示)False(エラーを非表示にし、ログに記録)
データベースSQLite(デフォルト)PostgreSQL/MySQL(パフォーマンス最適化)
静的ファイルrunserver自動配信使用してcollectstaticCDN に収集します
ALLOWED_HOSTS空のリストまたは['localhost']ドメインの設定が必要です(例:['example.com'])
その他の拡張