本記事にはDjangoで何を作ることができるのか、Djangoにはどのような特徴や機能があり、メリット・デメリットは何なのかをまとめています。

「名前だけは聞いたことがあり、詳しく知らない」「Djangoを導入しようか迷っている」方の参考として下さい。

最初にWebアプリケーションフレームワークの特徴や機能を押さえ、設計思想を把握して効率良く学習していきましょう。

次に「Djangoを学び始める」方向けに、複数あるDjangoのチュートリアルのうち、どれを選んで学べば良いかについて触れます。

特にインストール手順から「Hello, world!」までの手順を取り出して説明します。

最後に生成されたファイルやフォルダを個別に確認し、どこに何を書けばよいのか、その使い方も見ていきましょう。


Djangoとは

Django(ジャンゴ)はプログラミング言語Pythonで書かれたオープンソースのWebアプリケーションフレームワークです。

PythonはAI(人工知能)・機械学習・IoT・ビッグデータ解析などに使用されており、潤沢なライブラリが用意されています。

そして同プログラミング言語で書かれたDjangoでWebアプリケーション化し、データの利便性の向上や一般公開を図る流れが主流です。


Djangoができること

Djangoは主にWebアプリケーションの作成に利用されます。

またフロントエンドに対するバックエンド、つまりサーバーサイドの処理を実装する際にも用いられます。


Webアプリケーションの作成

Python製のWebアプリケーションを作成することが可能です。InstagramやYouTube、DropBoxなどの大手有名サイトが利用しています。

またDjango製のCMSにMezzanine・django CMS・Wagtailがあります。これらはDjangoとしてのカスタマイズも行うことができるのです

このようなオープンソースのシステムはCMSの他にも、メディアストレージ・Wiki・フィードリーダー・情報管理システムなど沢山あります。


RestfulなWebAPIの作成

Djangoには「Django REST framework」というRestfulなWebAPIを作成するためのツールキットです。

インストールと簡単な設定を行うだけで実装に必要な機能が揃います


Djangoの特徴

Djangoフレームワークを学習するにあたり、まず特徴や設計思想を押さえておきましょう。全体像を理解する速度を上げることができます。


フルスタックフレームワーク

Python製の有名なフレームワークのうち、フルスタックフレームワークに該当するのはDjangoのみです。

他のPython製のフレームワークには、最低限の機能のみを備えた軽量型のFlask・Bottleなどがありますが、いずれもマイクロフレームワークです。


MTVパターンを採用

DjangoはMTVパターンを採用しています。MTVはModel(モデル)・Template(テンプレート)・View(ビュー)の頭文字です。

Modelにはデータベースのテーブルやカラムの定義を記述します。またデータベースからのデータ取得を担うものです。

TemplateにはViewから渡されたデータをどのように表示するかを記述します。ページのデザインにあたる箇所です。

Viewではリクエスト情報やデータベース情報を処理し、どのようなデータを表示するかを決定します。

ちなみにSpringやRuby on Railsなどの他のWebアプリケーションフレームワークはMVCパターンを採用しています。


再利用可能なアプリケーション

Djangoは再利用可能なアプリケーションを作成し、このアプリケーションを簡単に共有・利用することができるようになっているのです。

WebAPIの作成で紹介した「Django REST framework」のほか、有益なデバッグ情報を表示する「Django Debug Toolbar」などもあります。

他のWebアプリケーションフレームワークでは、PHP製フレームワークSymfonyのBundleが近い考え方かもしれません。


Djangoの機能

Djangoにあらかじめ標準装備されている機能には、主に以下のようなものがあります。

  • Django管理サイト(django.contrib.admin)
  • ユーザー認証機能(django.contrib.auth)
  • モデル情報の取り扱い(django.contrib.contenttypes)
  • セッション管理(django.contrib.sessions)
  • メッセージ表示処理(django.contrib.messages)
  • 静的ファイル公開(django.contrib.staticfiles)

ここでは特にDjango管理サイトとユーザー認証機能について見ていきます。


Django管理サイト(django.contrib.admin)

Djangoが自動生成する管理サイトです。マスタ管理画面やログインアカウントの権限管理などを行う機能が付いています。

また表示するデータの変更やデザインの修正、新しいページの追加など柔軟にカスタマイズが行えるようになっています

Webアプリケーションの開発では、一般ユーザー用と管理者用のWebアプリケーションを1から作成するケースも多いのではないでしょうか。

Django管理サイトはこの管理者用のWebアプリケーションと同等かそれ以上の機能を有するものです。


ユーザー認証機能(django.contrib.auth)

Djangoに標準装備されているユーザー認証機能です。

また「django-allauth」パッケージを利用すれば、簡単な設定を行うだけでパスワード再設定からソーシャルログイン機能まで対応できます。

多くのエンジニアによって開発されたフレームワークとアプリケーションが利用できるため、セキュリティ的にも安全安心です。


Django導入のメリット

Djangoを導入するメリットについて見ていきましょう。


開発速度が早い

フルスタックフレームワークのため、Webアプリケーションの作成に必要な機能は一通り実装済みです。

加えてDjango管理サイトを始めとし、認証機能や権限管理機能、配信フィードの生成機能などが標準装備されています。

またDjango自体が再利用可能なアプリケーションであることは、サードパーティ製のパッケージの充実に貢献しています。

Django本体に実装されていない機能は「Django Packages」で検索を行い、なるべく車輪の再発明をしないようにしましょう


国内外ともにシェアが拡大傾向

かつてWebアプリケーションフレームワークといえばRuby on Railsが主流でした。

しかしGoogle Trendsで動向を調べると、世界的には2016年頃から拮抗し始め、現在ではRuby on Railsと肩を並べるまでになりました。

Laravelのシェアを急成長と表現するなら、Djangoは安定して徐々にシェアを獲得しているといえるでしょう。

日本国内でも徐々にDjango製のWebアプリケーション開発の案件が増えてきています。


日本語の記事や書籍が多い

他のPython製のWebアプリケーションフレームワークと比較すると、日本語の記事や技術書が多く、学習していて困ることはないでしょう。


Django導入のデメリット

Djangoを導入するデメリットについて見ていきましょう。


学習コストが少し高い

Djangoはフルスタックフレームワークです。またMTVパターンというあまり馴染みのない考え方をアーキテクチャとして採用しています。

MTVパターンはMVCパターンと比較しながら覚えることも多いですが、厳密に同じ役割ではないため最初は混乱するかもしれません。

またフルスタックフレームワークは提供されている機能が膨大なため、使い方を覚えて自在に扱えるようになるまでに時間がかかります


複雑なSQLは不得手

DjangoはORMにRuby on Railsと同じActiveRecordパターンを採用しています。

複雑な問い合わせに際して素のSQL文を実行することは可能ですが、セキュリティ面への配慮やModelへのマッピングなどに注意が必要です。


Djangoのチュートリアル

Djangoのチュートリアルには以下の2種類が存在します。いずれも無料で閲覧することができます。


Django Girls Tutorial

Django Girls Tutorialは公式チュートリアルより初心者向けです。

各種開発ツールの説明や、URL・HTMLなどの基本的な用語まで丁寧に説明されています。Ruby on Rails チュートリアルに近い位置付けです。


公式チュートリアル

Djangoドキュメントに記載されている公式のチュートリアルです。

「Djangoではこの機能はこう実装する」という説明が設計思想とともに記述されています。

こちらは別のWebアプリケーションフレームワークでの開発経験がある方向けの内容です。


Djangoのインストール手順

Djangoのインストール以前の開発ツールの準備や環境構築については以下が詳しいです。

  • Django Girls Tutorialのインストール

またDjangoのインストールの詳細については以下を参照して下さい。

  • Django公式ドキュメント クイックインストールガイド
  • Django Girls Tutorial Djangoのインストール

ここではPythonのバージョン確認から、「Hello, world!」までの手順をピックアップして説明します。


Pythonのバージョン確認

Pythonのバージョンは以下のコマンドで確認することができます。

  1. $ python3 –version
  2. Python 3.8.2

Djangoのバージョンと対応するPythonのバージョンは、マイナーバージョン単位で決まっています。

これはPythonのセキュリティサポートに関係しています。Pythonはなるべく最新のものを使用するようにしましょう。


Djangoのインストール

まずパッケージ管理システムpipを最新版にアップグレードします。

  1. $ python3 -m pip install –upgrade pip
  2. Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.0.2)

次にDjangoをインストールします。新しいディレクトリを作成し、移動してから以降の作業を開始して下さい。

既にPythonのVirtualenvを使っている方は仮想環境の中で作業を行いましょう。

  1. ~$ mkdir example
  2. ~$ cd example
  3. ~/example$ python3 -m pip install Django
  4. Collecting Django
  5. (中略)
  6. Installing collected packages: sqlparse, pytz, asgiref, Django
  7. Successfully installed Django-3.0.4 asgiref-3.2.7 pytz-2019.3 sqlparse-0.3.1

必要な方はここで「pip freeze > requirements.txt」を実行しておきます。

インストールされているDjangoのバージョンは以下のコマンドで確認できます。

  1. ~/example$ python3 -m django –version
  2. 3.0.4


Djangoで「Hello, world!」

Djangoでプロジェクトの作成とアプリケーションの作成、簡単なルーティング設定とレスポンスの返却を行います。


プロジェクトを作成する

Djangoプロジェクトは以下のコマンドで作成します。

  1. ~/example$ django-admin startproject mysite .

以下はtreeコマンドで出力したディレクトリとファイルの一覧です。manage.pyとmysiteディレクトリが作成されました。

  1. ~/example$ tree
  2. .
  3. ├── manage.py
  4. ├── mysite
  5. │  ├── __init__.py
  6. │  ├── asgi.py
  7. │  ├── settings.py
  8. │  ├── urls.py
  9. │  └── wsgi.py
  10. └── requirements.txt
  11. 2 directories, 7 files


アプリケーションの作成

Djangoアプリケーションは以下のコマンドで作成します。

  1. ~/example$ python3 manage.py startapp helloworld

以下はtreeコマンドで出力したディレクトリとファイルの一覧です。helloworldディレクトリが作成されました。

  1. ~/example$ tree
  2. .
  3. ├── helloworld
  4. │  ├── __init__.py
  5. │  ├── admin.py
  6. │  ├── apps.py
  7. │  ├── migrations
  8. │  │  └── __init__.py
  9. │  ├── models.py
  10. │  ├── tests.py
  11. │  └── views.py
  12. ├── manage.py
  13. ├── mysite
  14. │  (中略)
  15. └── requirements.txt
  16. 4 directories, 16 files

Djangoは基本的に「1プロジェクト複数アプリケーション」で構成されます。

プロジェクトにhelloworldアプリケーションの存在を知らせるために、「mysite/settings.py」のINSTALLED_APPSに以下のように追加します。

  1. INSTALLED_APPS = [
  2.     ‘django.contrib.admin’,
  3.     ‘django.contrib.auth’,
  4.     ‘django.contrib.contenttypes’,
  5.     ‘django.contrib.sessions’,
  6.     ‘django.contrib.messages’,
  7.     ‘django.contrib.staticfiles’,
  8.     ‘helloworld’, #追加
  9. ]

実はDjangoの機能の項で紹介した機能も、その一つひとつがDjangoアプリケーションです。


ルーティングの設定

「mysite/urls.py」を以下のように編集します。

  1. from django.contrib import admin
  2. from django.urls import include, path # includeの追加
  3. urlpatterns = [
  4.     path(‘helloworld/’, include(‘helloworld.urls’)), # 追加
  5.     path(‘admin/’, admin.site.urls),
  6. ]

次に「helloworld/urls.py」を新規作成し、以下のように記述しましょう。

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     path(”, views.index, name=’index’),
  5. ]


Viewの作成

「helloworld/views.py」を以下のように編集します。

  1. from django.shortcuts import render
  2. from django.http import HttpResponse # 追加
  3. # Create your views here.
  4. # 以降、追加
  5. def index(request):
  6.     return HttpResponse(‘Hello, world!’)


アプリケーションの起動

以下のコマンドでアプリケーションを起動しましょう。

  1. ~/example$ python3 manage.py runserver

下記のURLにアクセスすると「Hello, world!」と表示されているはずです。

  • http://localhost:8000/helloworld


ファイルから見るDjangoの使い方

以下のファイルはDjangoプロジェクトのディレクトリに自動生成されるファイルです。各々の役割は以下のようになっています。

  • コマンドライン ユーティリティ(manage.py)
  • 非同期対応 ASGIサーバー設定(asgi.py)
  • WSGI設定(wsgi.py)
  • プロジェクト設定(settings.py)

以下のファイルはDjangoアプリケーションのディレクトリに自動生成されるファイルやディレクトリです。

  • 管理サイト設定(admin.py)
  • アプリケーション設定(apps.py)
  • URLディスパッチャ・URLConf(urls.py)
  • モデル(models.py)
  • マイグレーション(migrationsディレクトリ)
  • ビュー(views.py)
  • テンプレート(templatesディレクトリ)
  • 自動テスト(tests.py)

プロジェクトディレクトリ配下の設定の変更は、属する全てのアプリケーションに影響を与えます。

またDjangoのファイル名と役割は明確です。

Djangoを扱う上で、今触っているファイルがプロジェクトかアプリケーションか、どんな役割のファイルかを意識しましょう。

何らかのバグが発生した場合の修正箇所の指標にもなりますし、新規開発の際には役割を把握した上で正しいコーディングをする必要があります。

やりたいこと・実装したいことについては、実装前に公式ドキュメントや各種アプリケーションのドキュメントをよく読むことが大事です。

試しに動くものを作るのは良いことですが、どのファイルに何を書くかを正しく理解した上で、改めてコードを見直す癖を付けましょう。