◤Python無料教材配布◢ JobCodeメールマガジン実施中!

【Python】Djangoとは?インストール方法から開発環境構築まで

django-setup-001

これからPythonフレームワークであるDjangoを始めたい初心者・入門者は、Djangoの実行環境を準備する必要があります。

そのために、Djangoのインストールのほかに実行環境構築も実施しなければ使えません。

ここでは、以下の悩みをお持ちの方に読み進めていただきたいです。

Djangoを始めるにあたって
  • そもそもDjangoとは?
  • Djangoの公式ドキュメント/チュートリアルが分かりづらい
  • Djangoプロジェクトの全体構造やディレクトリ/ファイル構成を学びたい

これらの悩みを解決しながら、Djangoのインストールと設定・環境構築を解説します。

記事を読み終えると、Djangoアプリケーション実行環境と初期Djangoプロジェクトの構造が理解できます。

目次

Django(ジャンゴ)とは?

django-setup-001

Django(ジャンゴ)は、Python製のWebフレームワークです。

PythonのWebフレームワークの中で最も利用者数が多いフレームワークになります。

また、Python製のフルスタックWebフレームワークを利用するなら現状でDjango一択です。

ライブラリとフレームワークの違い

アプリ開発を始めると、ライブラリやフレームワークなどを多用することになります。

また、図解がないと立ち位置が分からず理解しづらいです。

ライブラリとは

ライブラリは、複数のパッケージから成り立っています。

注意点として、標準ライブラリとがぶライブラリがあります。

例えば、Pythonインストール時点で同梱されるライブラリは標準ライブラリになります。

また、Numpyやpandas/seleniumなど別個インストールするものは外部ライブラリにあたります。

フレームワークとは

フレームワークは、アプリケーション開発において全体の枠組みを決める機能を持ちます。

そのため、フレームワークは「枠組みを決める」、ライブラリは「機能を実現させる」ものとして目的から役割を分かちます。

ここでは、例としてPythonの代表的なフレームワークを記載します。

スクロールできます
フレームワーク公式サイト初回リリース時期
Flask(フラスク/フラスコ)https://palletsprojects.com/p/flask/2010年
Django(ジャンゴ)https://www.djangoproject.com/2005年
Bottle(ボトル)https://bottlepy.org/docs/dev/2009年
FastAPI(ファストエーピーアイ)https://fastapi.tiangolo.com/2018年
python製フレームワーク表

ライブラリとフレームワークの役割と概念理解に注意しましょう。

PythonとDjangoのバージョンと注意点

Djangoのバージョンは、Pythonのバージョンと密接に関連しています。

スクロールできます
DjangoバージョンPythonバージョン
4.23.8, 3.9, 3.10, 3.11, 3.12(4.2.8で追加)
5.03.10, 3.11, 3.12
5.13.10, 3.11, 3.12, 3.13(5.1.3で追加)
5.23.10, 3.11, 3.12, 3.13

サポートが終了したPythonバージョンは、Pythonプロジェクトによって保守されなくなるためDjangoで使用すべきではありません。

Djangoの特徴

DjangoにはWebフレームワークとして以下の特徴があります。

Djangoの主な特徴
  • フルスタックWebフレームワーク
  • MVTモデルの採用
  • セキュリティ機能の装備

Djangoは、別のPython製フレームワークと比べて開発規模が大きい場合に利用されます。

【Djangoの特徴】フルスタックWebフレームワーク

改めて、DjangoはフルスタックWebフレームワークです。

そのため、中規模以上のWebアプリケーション開発に用いられます。

また、Djangoをインストールすると次のような機能が利用できます。

Djangoが提供する主な機能
  • ユーザー認証
  • ORM(O/Rマッパー)
  • URLディスパッチャ
  • Djangoモデルインスタンスのシリアル化機構
  • 組み込みサーバー
  • HTMLフォーム検証システム
  • キャッシュフレームワーク
  • 管理画面
  • 多言語化機構
  • テンプレートエンジン機能拡張機構

また、Django REST framework(DRF)を追加インストールすると、WebアプリだけでなくREST API(RESTful API)が作れます。

【Djangoの特徴】MVTモデルの採用

django-setup-003

Djangoでは、UIを持つアプリを実装するデザインパターンとしてMTV(Model/View/Template)モデルを採用しています。

Model/View/Templateは以下の役割を持ちます。

Djangoの主な特徴
  • Model:ロジックを担当
  • View:入力を受け取りModelとTemplateを制御
  • Template:入出力を担当

一般的に、MVCモデル(Model/View/Controller)が有名ですが、MTVのViewはMVCのControllerに相当し、MTVのTemplateはMVCのViewに相当します。

【Djangoの特徴】セキュリティ機能の装備

Djangoはいくつかセキュリティ機能が標準装備されており、他のPython製フレームワークよりもセキュリティ対策が充実しています。

以下は、Django標準のセキュリティ機能一覧になります。

スクロールできます
機能名対応する脅威
XSS対策(クロスサイトスクリプティング)ユーザー入力によるHTML/JS注入
CSRF対策(クロスサイトリクエストフォージェリ)不正リクエスト送信
SQLインジェクション防止DBクエリ改ざん
クリックジャッキング防止iframeによるUIハイジャック
セッション保護機構セッション固定攻撃/ハイジャック
パスワードハッシュ化(PBKDF2, bcrypt等)パスワード漏洩・盗聴
HTTPS強制・セキュリティヘッダ設定通信盗聴・改ざん
ホストヘッダ検証HTTP Hostヘッダ攻撃
ファイルアップロード安全化任意ファイル実行
管理サイト(admin)保護機構管理画面不正アクセス
クリックジャッキング対策(X-Frame-Options)UI偽装攻撃
Content Security Policy対応(CSP)スクリプトインジェクション抑止
SSL Cookie設定Cookie盗難防止
セキュリティミドルウェア各種ヘッダ付与・検証
Djangoのセキュリティ機能一覧
XSS対策(クロスサイトスクリプティング)

XSS(クロスサイトスクリプティング)は、ユーザーが入力したデータをHTML内にそのまま出力すると悪意あるスクリプトが実行される脆弱性を突いた手法です。

Djangoテンプレートエンジンは自動エスケープ機構を持ち、デフォルトでHTMLタグやJSを無効化します。

# views.py
from django.shortcuts import render

def hello(request):
    name = request.GET.get("name", "")
    return render(request, "hello.html", {"name": name})
<p>こんにちは、{{ name }} さん!</p>

<script>alert(1)</script>と入力しても、HTML上では次のようにエスケープされます。

<p>こんにちは、<script>alert(1)</script> さん!</p>

危険なケースとして、{{ name|safe }} とするとエスケープが無効化されて危険です。

補足
  • Djangoのテンプレートは自動エスケープONがデフォルト。
  • フィルタ|safeの使用は厳重注意。
  • 必要ならばbleachなどのホワイトリストHTMLサニタイザで制御。
CSRF対策(クロスサイトリクエストフォージェリ)

CSRF(クロスサイトリクエストフォージェリ)は、ログイン中のユーザーが外部サイトから不正なPOSTリクエストを送信される攻撃です。

DjangoはデフォルトでCSRFトークン認証を行います。

<!-- template.html -->
<form method="POST" action="/comment/">
  {% csrf_token %}
  <input type="text" name="comment">
  <button type="submit">送信</button>
</form>
# views.py
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render

def post_comment(request):
    if request.method == "POST":
        ...
    return render(request, "template.html")
補足
  • {% csrf_token %}をフォーム内に入れるとDjangoが自動でトークンを検証。
  • ミドルウェアCsrfViewMiddlewareが有効ならトークンがないリクエストは拒否。
  • APIで使う場合は@csrf_exempt or CSRF_TRUSTED_ORIGINSの設定可能。
SQLインジェクション防止

SQLインジェクションは、SQL文にユーザー入力が直接入るとクエリが改ざんされる脆弱性を突いた攻撃です。

DjangoのORMはプレースホルダー構文を自動で使用し、SQL文を安全に生成します。

# 安全:Django ORM
from myapp.models import User

user = User.objects.filter(username=request.GET.get('username')).first()

内部的にSELECT * FROM user WHERE username = %sのようにプレースホルダー化されます。

その他、Djangoのセキュリティ対策一覧の詳細情報を知りたい人は公式ドキュメントから確認できます。

Djangoでできること

Djangoが活用されるケースは、主に以下の2つで活用されます。

Djangoが活用されるケース
  • Webアプリケーション開発
  • WebAPI開発

ここでは、簡単にDjangoがWebアプリ&API開発に強い理由をまとめています。

スクロールできます
Djangoの特性Webアプリ開発での利点API開発での利点
ORM(データベース抽象化)データベース構築が容易シリアライザと連携してデータ出力
MVTアーキテクチャロジック分離で保守性高REST構造に転用しやすい
認証・権限管理ログイン制御を即導入Token・JWT対応が容易
管理画面自動生成データ運用・確認が即可能デバッグ・管理用途にも活用可
強固なセキュリティCSRF, XSS, SQL対策が自動認証付きAPIでも高セキュリティ
拡張性アプリ分割構成に強いDRF, GraphQLなど拡張容易

Webアプリケーション開発

再三記載していますが、DjangoはフルスタックWebフレームワークです。

そのため、Webアプリに必要な機能がはじめから揃っています。

スクロールできます
標準装備されている機能用途
ORM(Object Relational Mapper)DB操作をPythonコードで簡単に行える
認証機能(ログイン/ログアウト/権限管理)ユーザー管理を自動化
管理サイト(Django Admin)データの登録・編集・削除をGUIで可能
テンプレートエンジン動的HTML生成
URLルーティングURLごとに処理を分岐
フォームバリデーションユーザー入力の検証
セキュリティ機能CSRF/XSS/SQL Injection対策が標準装備

上記の機能が最初から揃っているため、開発者はビジネスロジックに集中できます。

「小規模な個人アプリ」から「大規模な商用サービス」まで幅広く対応できます。

また、Djangoを使ったWebアプリのサービス例が以下になります。

スクロールできます
サービス種別Djangoでの強み
SNS(コミュニティサイト)認証機能・ORM・管理画面で効率的に構築
ECサイト商品DBやユーザー管理を容易に構築
ブログ・ニュースサイト管理画面+テンプレートで即構築
学習管理システム(LMS)ユーザー権限とフォームバリデーションを活用

特にデータ中心のWebサービス(SNS・CMS・ECサイト)に最適です。

WebAPI開発

DjangoはHTML生成だけでなく、「データをAPIとして外部に提供する」ことも得意です。

特に拡張ライブラリDjango REST Framework(DRF)を使うことで、JSONレスポンスを返すRESTful APIを高速に構築できます。

スクロールできます
機能説明
シリアライザ(Serializer)ModelのデータをJSON形式に変換
認証・認可Token認証/JWT/OAuth2などが簡単に実装可能
ページネーションデータを分割して返す仕組み
フィルタ・検索QuerySetを自動でフィルタリング
ブラウザ対応APIAPIをブラウザ上で直接確認できる
Django REST Framework(DRF)の特徴

また、Djangoを使ったAPI開発のサービス例が以下になります。

スクロールできます
サービス種別Djangoの活かし方実例
モバイルアプリのバックエンドAPIサーバーとして機能(iOS/Android連携)Instagram API, Pinterest
フロント分離型Web(SPA)React/Vueと連携するバックエンドAPIReact + DRF構成など
IoTデータ連携APIセンサーや外部機器との通信処理工場・医療用IoT基盤
機械学習モデル提供APIモデル推論をWeb経由で提供AI APIサーバー

Djangoは「データベースと外部クライアント(フロント・モバイル)をつなぐシステム」として活用されます。

強力なORMと認証機構を活かして、APIサーバーを短時間で構築できます。

Djangoを利用するためのPython開発環境構築

PythonのWebフレームワークであるDjangoを利用するには、Pythonの開発環境構築が必要です。

Pythonの開発環境を構築するために、以下の手順を示します。

Djangoを利用するためのPython環境構築手順
  1. Pythonのダウンロードとインストール
  2. Visual Studio Code(VSCode)のインストール
  3. Djangoのインストール

本記事では、Djangoのインストールからメインに記載しておりますが、PythonとVSCodeインストールがまだできていない人は「【Python】ダウンロードとインストール方法から実行環境構築まで」を一読ください。

Pythonにてローカル環境に仮想環境を作成する

Pythonで開発を実施する際、開発プロジェクトごとに専用の実行環境を作成し切り替えることができます。

また、開発用として一時的に作成する実行環境を「仮想環境」と呼びます。

ローカル環境で開発を進めるにあたり、venvモジュールを利用し仮想環境を構築します。

venvは、Pythonに標準搭載された仮想環境用モジュールです。

venvを利用することで、プロジェクトごとに分離したPython実行環境を構築できるため、各実行環境でそれぞれのパッケージを管理できます。

Pythonによる仮想環境の構築方法が知りたい人は、「【Python】ダウンロードとインストール方法から環境構築まで」を一読ください。

Djangoのインストール

本記事では、WindowsPCによる任意のディレクトリにて「django-project」を作成しています。

インストール自体は簡単で、以下のコマンドを実行しましょう。

pip install django

上記のコマンドを実行すると、最新バージョンであるDjangoのインストールが完了します。

また、バージョン指定によるDjangoのインストールを実施したい場合は、以下のコマンドで実行します。

pip install django==4.2.10

Djangoが依存するパッケージ

Djangoをインストールすると、Djangoが依存しているパッケージも同時にインストールされます。

また、インストールされたパッケージを確認するには、以下のコマンドで確認できます。

pip list

Djangoをインストールすることで同時にインストールされるパッケージは以下です。

スクロールできます
パッケージ説明
asgirefASGIユーティリティ群(sync/asyncブリッジやライフサイクル補助)を提供。
Djangoの非同期処理サポートに使われる。
sqlparseSQLのパース/フォーマット/分割を行うライブラリ。
Djangoの開発/デバッグ用にSQLの整形や分割で利用される。
tzdataIANAタイムゾーンデータをPython環境に提供するパッケージ。
zoneinfo経由で正確なタイムゾーン変換を可能にする。

Djangoで利用する代表的なモジュール

ここでは、Django本体に含まれる主要モジュールをカテゴリに分けてまとめています。

一つ一つのモジュールに関する詳細情報は別途調べましょう。(膨大にあるため)

スクロールできます
カテゴリ名説明
コア機能モジュール群Djangoの基盤となる中核部分。
アプリ設定/例外/コマンド実行/共通ユーティリティなど全機能の土台を形成。
URL/ルーティングURLとビューの対応付けを管理。
path()やre_path()により柔軟なルーティングを実現し、URL逆引きにも対応。
テンプレート/テンプレートタグHTMLやメール本文などの動的生成を担うテンプレートエンジン。
タグ・フィルタでロジックを簡潔に記述可能。
ミドルウェア群リクエストとレスポンスの間に処理を挟み込む仕組み。
セキュリティ/CSRF/セッション/認証などを自動適用。
データベース/ORMモデルを通じてDB操作を抽象化するORM機構。
SQLを直接書かずデータ操作/マイグレーション可能。
フォーム/バリデーション入力フォームの生成/検証を担当。
フォーム定義とモデルを連携し、入力値を安全に処理/保存できる。
認証/権限/セッションログイン/ログアウト/ユーザー権限管理/セッション保持などWeb アプリに不可欠な認証機能群。
国際化/翻訳多言語対応を支援。
gettextベースでテキスト翻訳やタイムゾーン変換、ロケール管理を提供。
管理サイト/contribアプリ管理画面(Admin)をはじめとするDjango標準アプリ群。
認証/静的ファイル/地理情報など多機能を提供。
キャッシュ/メール/ファイル処理/ユーティリティキャッシュバックエンド/メール送信/ファイル入出力/各種補助関数群を含むアプリ共通の支援モジュール。
Djangoの主要モジュールをまとめたカテゴリ一覧

Djangoのユーティリティコマンド

Djangoには、2種類のユーティリティコマンドがあります。

ユーティリティコマンド
  • django-admin
  • manage.py

django-adminコマンドは、Djangoプロジェクト作成時にしか使いません。

manage.pyコマンドは、Djangoアプリケーション作成だけでなく様々な場面で使います。

django-adminコマンド

Djangoプロジェクトを作成する場合は、django-adminコマンドで自動作成できます。

django-admin startproject <プロジェクト名>

Django==5.2.7にて実行しています。

任意のディレクトリにてコマンドを実行すると、以下のディレクトリを自動作成します。

django_project
├── django_project
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

また、ハイフンを含んだプロジェクト名などはDjangoにおいて命名規則に反することがあります。

上記のエラーが発生した場合は、別のプロジェクト名に変更しましょう。

manage.pyコマンド

manage.pyコマンドは、主にDjangoアプリケーションに対して操作を実行します。

manage.pyコマンドの主な操作
  • Djangoアプリケーションの自動作成
  • 開発サーバー(runserver)の起動
  • マイグレーションの作成/実行/状況確認/ロールバック
  • スーパーユーザーの作成
  • テストの実行
  • インタープリターの実行

Djangoアプリケーションの自動作成

Djangoアプリケーションを自動生成する場合は以下のコマンドを実行します。

python manage.py startapp <アプリケーション名>

Django==5.2.7にて実行しています。

ここでは、アプリケーション名をdjango_appと命名しています。

自動生成した場合、以下のディレクトリ構成が作成されます。

django_project
├── django_app
│   ├── migrations
│   │   └── __init__.py
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── django_project
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

django_appフォルダも含め、以降の階層内のフォルダ・ファイルも自動生成されています。

開発サーバー(runserver)の起動

Djangoプロジェクトをローカルマシンの環境で動作させるため、開発用サーバーを起動するコマンドは以下になります。

python manage.py runserver

上記のコマンドを実行し、http://127.0.0.1:8000/にアクセスしてみましょう。

django-setup-004

初期状態のプロジェクトであれば、上記のような画像が表示されます。

マイグレーションの作成/実行/状況確認/ロールバック

モデルに記述したデータベーステーブル定義に基づき、マイグレーションファイルの自動生成/実行は以下になります。

python manage.py makemigrations

No installed app with labelエラーが出る場合は、解決方法としてsettings.pyのINSTALLED_APPSに<アプリケーション名>を追加します。

INSTALLED_APPS = [
    '<アプリケーション名>',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
python manage.py migrate

また、マイグレーションの履歴はDjangoが管理するテーブル(django_migrations)に保存されます。

履歴データを使い、マイグレーションの適用状況を確認あるいは以前の状態に戻すことができます。

以下のコマンドにて、マイグレーションの適用状況を確認できます。

python manage.py showmigrations <アプリケーション名>

showmigrationsコマンドもsettings.pyに追加しないとNo installed app with labelエラーが出るため注意しましょう。

例えば、以下のマイグレーション適用状況があるとします。

[X]0001
[X]0002
[ ]0003
[ ]0004

マイグレーションファイルの一覧と適用状況が[X]で表示されます。

[X]になっている舞う偽レーションファイルは適用済みを意味しています。

以下のコマンドにて、マイグレーションのロールバックを実行できます。

python manage.py migrate <アプリケーション名> 0001
[X]0001
[ ]0002
[ ]0003
[ ]0004

スーパーユーザーの作成

スーパーユーザー(サイト管理者)を作成するには、「createsuperuser」を指定します。

以下のコマンドを実行すると、ユーザー名とメールアドレスとパスワード入力が求められます。

入力を終えると、スーパーユーザーが作成された旨が表示されます。

python manage.py createsuperuser
Username: <任意のユーザー名>
Email address: <任意のメールアドレス>
Password: <任意のパスワード>
Password (again): <任意のパスワード>
Superuser created successfully.

http://127.0.0.1:8000/admin/login/?next=/admin/にアクセスしてみましょう。

django-setup-005

作成したスーパーユーザーでログインすると、サイト管理画面にログインできます。

django-setup-006

テストの実行

テストコードを実行するには、「test」を指定します。

テスト範囲を指定し実行することも可能です。

以下は、ケース例によるテストになります。

# プロジェクト内の全テスト実行
python manage.py test
# アプリケーション単位の実行
python manage.py test django_app
# テストモジュール単位の実行
python manage.py test django_app.tests.test_views
# テストクラス単位の実行
python manage.py test django_app.tests.test_views.TestTaskCreateView

インタープリターの実行

「shell」を指定しコマンド実行すると、Djangoプロジェクトの設定を読み込みインタープリターを起動します。

Djangoのライブラリが使えるため、主にモデルを呼び出しデータベース操作をテストする用途などで使えます。

python manage.py shell

Djangoプロジェクトの全体構造

Djangoは、1つのWebアプリを1プロジェクト(1ディレクトリ)で管理します。

また、プロジェクトはプロジェクト全体に関わる設定を記述したファイル群(1ディレクトリ)と機能単位にまとめたアプリケーション(これも1ディレクトリ)で構成されます。

django-setup-007
Djangoプロジェクトとアプリケーションの関係

プロジェクトは1つ以上のアプリケーションが必要になり、全ての機能を1アプリケーションで構成することも可能です。

しかし、多機能なWebアプリケーション開発の場合、1ファイルのコード量が増加し複雑になるため、あまりおすすめできません。

さらに、各アプリケーションが互いに依存しないよう独立性を保つことで、アプリケーションを削除や使い回しなど再利用性と拡張性につながります。

Djangoプロジェクトのディレクトリ/ファイル構成

ここでは、django-adminコマンドによるプロジェクト自動生成とmanage.pyコマンドによるアプリケーション作成を実行します。

また、初期状態のDjangoプロジェクトのディレクトリ/ファイル構成を考えます。

ただし、templatesディレクトリやindex.htmlが自動生成されないため、テンプレートは追加しています。

django_project
├── django_app
│   ├── migrations
│   │   └── __init__.py
│   ├── templates
│   │   └── index.html
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── django_project
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Django==5.2.7にて実行しています。

以下は、プロジェクト用ディレクトリ/ファイル構成とアプリケーション用ディレクトリ/ファイル構成に分けて端的な説明を記載しています。

スクロールできます
ディレクトリ名ファイル名説明
django_projectプロジェクト全体に関わるファイルをまとめるディレクトリ
django_project__init__.pyPythonパッケージだと示すファイル
django_projectasgi.pyデプロイ用ファイル
django_projectsettings.pyプロジェクト設定ファイル
django_projecturls.pyプロジェクト用ルーティング定義ファイル
django_projectwsgi.pyデプロイ用ファイル
プロジェクト用ディレクトリ/ファイル構成
スクロールできます
ディレクトリ名ファイル名説明
django_appアプリケーション関連ファイルをまとめるディレクトリ
migrationsマイグレーションファイルを格納するディレクトリ
migrations__init__.pyPythonパッケージだと示すファイル
templatesテンプレートファイルを格納するディレクトリ
templatesindex.htmlテンプレートファイル
django_app__init__.pyPythonパッケージだと示すファイル
django_appadmin.py管理サイト設定ファイル
django_appapps.pyアプリケーション構成設定ファイル
django_appmodels.pyモデル定義ファイル
django_apptests.pyテストコード記述ファイル
django_appviews.pyビュー定義ファイル
アプリケーション用ディレクトリ/ファイル構成

最上位ディレクトリに配置されているmanage.pyは、コマンド実行用ファイルになります。

この記事を書いた人

sugiのアバター sugi Site operator

【経歴】玉川大学工学部卒業→新卒SIer企業入社→2年半後に独立→プログラミングスクール運営/受託案件→フリーランスエンジニア&SEOコンサル→Python特化のコンテンツサイトJob Code運営中

目次