初めてのDjango4。入門中の入門

Django初心者、入門者向けに、DjangoのインストールからDjango開発を始めるための導入部分について説明しています。

目的と動作環境

最終更新日:2022/11/1

DjangoはPythonで人気のWebフレームワークです。本記事では、Django初心者向けのDjango入門という事で、DjangoインストールからDjango開発を始めるための導入部分について説明しています。

■動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.7)
Python:3.9
Django:4.1

本記事はPythonがインストールされている事を前提に説明しています。Pythonのインストール方法については検索すれば多くの情報が出てくると思うので他サイトを参考にしてください。また、Python自体のバージョン管理やバージョンの切り替えのためのツールとしてpyenvがあります。pyenvは必須ではないですが、別ページで説明していますので気になる方は参考にしてみてください。
(macOS)pyenvとPython3.9をインストールする

Python仮想環境のvenvについて

Djangoのインストールの前にvenvについて簡単に説明します。venvはPythonの仮想環境を作成するための機能です。Pythonはパッケージのバージョン管理の問題があるので、開発プロジェクト毎にPython環境があると非常に便利で、そのためのツールとしてvenvがあります。

Djangoプロジェクトで何かWebサイト(Webアプリ)を開発する時も、Djangoプロジェクト毎にvenvのPython環境を使うのが便利で良いと思います。venvの使い方については別ページで説明しいますので、そちらを参考にしてください。
venvでPythonの仮想環境を試してみる

Djangoのインストール

それではまず初めにDjangoをインストールします。Djangoはpipでインストールできます。

$ pip install django

Djangoの特定バージョンを指定してインストールする事もできます(バージョン3.2.1をインストールしたい場合)。

$ pip install django==3.2.1

インストールされたDjangoのバージョンを確認したい場合、"pip list"だけでなく、pythonやdjango-adminコマンドでも確認できます。

$ pip list
Package    Version
---------- -------
asgiref    3.5.2
Django     4.1.2
pip        22.3
setuptools 49.2.1
sqlparse   0.4.3

$ python -m django --version
4.1.2

$ django-admin version
4.1.2
私の環境ではバージョン4.1.2のDjangoがインストールされました(2022/10/20時点の最新安定版だと思います)。

Djangoプロジェクトの作成

Djangoをインストールできたら、Djangoプロジェクトを作成します。

Djangoプロジェクトを作成するにはdjango-adminコマンド(とstartprojectサブコマンド)を実行します(firstprojectは適当なプロジェクト名)。

$ django-admin startproject firstproject
django-adminでDjangoプロジェクトを作ると、firstprojectディレクトリが作成されて、その中にさらにfirstprojectディレクトリとmanage.pyファイルが作成されます。
$ ls
firstproject
        
$ tree firstproject
firstproject
├── firstproject
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Django付属のWebサーバを起動してブラウザで動作確認をする

Djangoには開発用のWebサーバが付属していて、Djangoプロジェクトを作成すればそのWebサーバを起動して、ブラウザでDjangoアプリの動作確認をできるようになります。

付属Webサーバを起動するには、manage.pyファイルを使って"python manage.py runserver"コマンドを実行します。

$ cd firstproject
$ ls
firstproject manage.py

$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 20, 2022 - 18:39:57
Django version 4.1.2, using settings 'firstproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Webサーバ(とDjangoアプリ)を起動しました!

ターミナルのコンソールログを見ると、開発Webサーバが起動してURLはhttp://127.0.0.1:8000/とありますので、ブラウザでそのURLにアクセスして確認します("127.0.0.1"は自分のPCのIPアドレスなので、http://localhost:8000でもアクセスできます)。
初めてのDjangoアプリを起動してブラウザで確認
ブラウザ上に"The install worked successfully! Congratulations!"というメッセージが出ていれば、ちゃんと起動しています!
Webサーバを終了したい時は、ターミナル上でショートカット"Ctrl-C"です。

また、Webサーバを起動した時のデフォルトのポート番号は8000ですが、ポート番号を指定してWebサーバを起動する事もできます。ポート番号を指定したい場合、コマンドのrunserverの後にポート番号を指定します(試しに8085番で起動)。

$ python manage.py runserver 8085
〜
Starting development server at http://127.0.0.1:8085/
Quit the server with CONTROL-C.
起動したらURLはhttp://127.0.0.1:8085/でアクセスできるはずです!

また、ブラウザ画面のDjangoアプリの文言は英語でした。日本語化したい場合、settings.pyファイルのLANGUAGE_CODEとTIME_ZONEを編集します(settings.pyは、firstproject/firstprojectディレクトリにあります)。
■編集前

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
■編集後
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
編集したら再度Webサーバを起動してブラウザで確認します。
Djangoアプリの日本語化をブラウザで確認
日本語表示になりました!

”python manage.py runserver”コマンドでWebサーバを起動した時に、ターミナルのコンソールログに赤字のメッセージが出力されました。

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
このメッセージは、実行されていない18のマイグレーションがあるという意味です。マイグレーションとは、(ここではDBを使わないので詳しく説明しませんが)、簡単に言うとDB(データベース)のスキーマをDjangoのModelからDBに反映するための作業(ツール)です。

このメッセージは赤字でエラーメッセージぽいけど、当面放っておいても問題ないと思います。今回はDjangoのインストールから導入までの説明をしているだけでDBは使わないですし(DBを使う段階になったらModelのプログラミングとマイグレーションをやると思います)。もしもそれでもこのメッセージが気になる人は、メッセージに書いてあるようにマイグレーションコマンドを実行すれば、このメッセージは表示されなくなります。

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
〜

あと、初めてWebサーバを起動すると、firstprojectプロジェクトのディレクトリ直下にdb.sqlite3が生成されます。

$ ls
db.sqlite3   firstproject manage.py
これはDjangoがデフォルトのDBにsqliteを使うからでそのDBファイルです。Djangoはsqlite以外にもPostgreSQL、MariaDB、MySQL、OracleなどのメジャーDBはサポートしていますので、他のDBを使いたい場合はDBを用意して簡単な設定をすれば、使用するDBを切り替える事ができます。

Djangoには開発用のWebサーバが内蔵されているという話をしましたが、これはあくまで開発用です。本番環境でDjangoアプリを公開する時は、NginxやApacheなどの本格的なWebサーバを使う事になると思います(DjangoアプリとWebサーバを連携する)。

Djangoアプリの作成

次に、Djangoアプリを作成します。DjangoではDjangoプロジェクトを作成し、そのプロジェクト内にDjangoアプリを作り開発していきます。Djangoプロジェクト内に作るDjangoアプリは、1つでも複数でもいいです。

という事でDjangoアプリを1つ作成します。Djangoアプリを作成するには、manage.pyを使ってstartappサブコマンドを実行します(適当にfirstappという名前のアプリを作成してみる)。

$ python manage.py startapp firstapp
firstappアプリの雛形が作成されて、firstappディレクトリができました。
$ ls
db.sqlite3   firstapp     firstproject manage.py

$ tree firstapp
firstapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

firstappディレクトリ内には色々ファイルが作成されました。firstappアプリを開発するには、このディレクトリ内のファイルを編集したり新規作成したりする事になります。そしてこれがDjangoのプログラミング開発のメイン部分になります。

■Figの紹介
Djangoとは直接関係ない話ですが、Figについてちょっと話します。Figはターミナルでコマンド操作をする時にオートコンプリート機能で入力候補示してくれる便利なツールです(2022/10/31時点では、macのターミナルで使えるが、Windows/LinuxはComming soon状態です)。
Figによるターミナルコマンドの紹介

DjangoをインストールするとDjango関係のコマンドを使えるようになりますし、多くのサブコマンドもあります。これまでの説明でDjangoプロジェクトやDjangoアプリの作成で使ったコマンドはそのほんの一部です。他にも多くのDjango関連のコマンドはありますが、それをいちいち覚えたりキーボードで入力するのは正直ちょっと面倒です。

そんな時に便利なのがFigです。Figを使えば、Django関連のコマンドを入力するのが楽になります。また、FigはDjangoだけでなく、python,pipコマンドでも使えるし、他のよく使うツール系コマンドのgit,docker.npmでも使えるし、Mac(Unix)標準コマンドでも機能します。

Figの詳細については別ページで説明しているので、興味のある方はそちらを参考にしてください。
Figをインストールしてコマンド操作を自動補完で快適にする

Djangoアプリの開発。HTTPリクエストの処理。views.py、urls.py、テンプレートファイル(HTML)の作成

次に、作成したfirstappアプリ内に簡単なHTTPのGETリクエスト処理を追加します。

まず、HTTPリクエストを受けた時のサーバ側の処理で、views.pyファイル(firstproject/firstapp/views.py)にhello関数を追加します(HttpResponseをimportもする)。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def hello(request):
    return HttpResponse("こんにちは、初めてのDjango!")
hello関数は、呼び出された時に「こんにちは、初めてのDjango!」という文字列をクライアント側に返すだけの処理です。

そして、URLのルーティングパターンの設定です。
firstappアプリのurls.pyファイル(firstproject/firstapp/urls.py)を新規作成します。

from django.urls import path
from . import views

urlpatterns = [ 
    path("hello", views.hello, name="hello"),
]
また、firstprojectプロジェクトのurls.py(firstproject/firstproject/urls.py)を編集します。「path('firstapp/', include("firstapp.urls")),」の1行を追加と、includeをimportもする。
(この1行追加で、上で新規作成したfirstappアプリのurls.pyを読み込むようになり、firstappアプリのURLルーティングのコントロールは、firstappのurls.pyで設定できるようになる。)
from django.contrib import admin
from django.urls import path, include

urlpatterns = [ 
    path('firstapp/', include("firstapp.urls")),
    path('admin/', admin.site.urls),
]
この2つのurl.pyによって、「http://127.0.0.1:8000/firstapp/hello」にリクエストをした場合、サーバサイドではviews.pyのhello関数でリクエストを受けるようになります。

ちなみに、firstappアプリのurl.pyの「path("hello", views.hello, name="hello")」のname属性の値(hello)についてですが、ここではname属性に適当な名前をつけても、name属性自体設定しなくても正常に動作します。
ただ、もちろんこれも意味のある値で他の場面で使用する事もあるので(例えばテンプレートファイルでURLリンク先設定時とか)、ちゃんと意味のある名前を付けておく方が良いです。

それでは、ブラウザで動作確認してみます。アクセスするURLはhttp://127.0.0.1:8000/firstapp/helloです。
初めてのDjangoをブラウザで動作確認
できていれば、「こんにちは、初めてのDjango!」と表示されるはずです。

もしもURLをhttp://127.0.0.1:8000/helloにしたいなら、firstprojectプロジェクトのurls.pyに追加したpath文をこうすればできます。
#path('firstapp/', include("firstapp.urls")),
path('', include("firstapp.urls")),

次に、views.pyにもう1つ関数を追加して、今度はテンプレートファイル(HTMLファイル)をレスポンスして表示するようにします。

views.pyにhello2関数を追加します。hello2は、リクエストを受けたらfirstapp/hello2.htmlを返します。

def hello2(request):
    resdict = {"resstr":"こんにちは、2回目のDjagno!"}
    return render(request, "firstapp/hello2.html", resdict)
firstappのurls.pyに、hello2のURLルーティング設定を追加します。
from django.urls import path
from . import views

urlpatterns = [ 
    path("hello", views.hello, name="hello"),
    path("hello2", views.hello2, name="hello2"),
]
そして、firstappアプリ内にテンプレートファイル用のディレクトリを作成します。
$ mkdir -p firstapp/templates/firstapp
作成したディレクトリ内にテンプレートファイルhello2.htmlを新規作成します。
$ cat firstapp/templates/firstapp/hello2.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>タイトル</title>
</head>
<body>
<p>{{ resstr }}</p>
</body>
</html>
{{ resstr }}は、サーバサイドから受けた変数resstrを表示しているだけです。

treeでfirstappアプリ内のファイル構成です。

$ tree firstapp/
firstapp/
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-39.pyc
│   ├── urls.cpython-39.pyc
│   └── views.cpython-39.pyc
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── templates
│   └── firstapp
│       └── hello2.html
├── tests.py
├── urls.py
└── views.py

あと、テンプレートファイルを返して表示するには、firstprojectプロジェクトにfirstappアプリを登録する必要があります。登録するには、settings.py(firstproject/firstproject/settings.py)ファイルのINSTALLED_APPS内に、'firstapp.apps.FirstappConfig'の1行を追加します。

INSTALLED_APPS = [
    'firstapp.apps.FirstappConfig',    #この行を追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
アプリの登録は、テンプレートファイルを使うとか関係なく、アプリを作成した時点でプロジェクトに登録した方が良いかもしれませんね。

これでコーディングはできたのでブラウザで動作確認します。
アクセスするURLはhttp://127.0.0.1:8000/firstapp/hello2です。
できていれば、ブラウザに「こんにちは、2回目のDjagno!」という文言が表示されます!

■ブラウザでアクセスした時に、TemplateDoesNotExist例外が発生する場合
ブラウザでの動作確認時に、正しく動作せずにエラーメッセージでTemplateDoesNotExistという文言が見られるかもしれません。
「TemplateDoesNotExist at /firstapp/hello2
django.template.exceptions.TemplateDoesNotExist: firstapp/hello2.html」

TemplateDoesNotExistが出る原因として考えられるのは、例えば、テンプレートファイルhello2.htmlがちゃんと正しいディレクトリ内に存在するかや、settings.pyのINSTALLED_APPSにアプリを登録するコードを追加していないなどがあると思います。

■MTVとMVCについて
DjangoはフルスタックのWebフレームワークですが、MTVフレームワークと呼ばれています。MがModel、TがTemplate、VがViewです。上で作成したfirstappアプリだと、Vはviews.py、Tはhello2.htmlです。今回のfirstappにはDBは使っていないのでM(Model)はありません。

また、WebフレームワークにはMVCフレームワークというのが多くあります。例えば、JavaのSpring Boot、RubyのRails、PHPのCakePHPなどです。MがModel、VがView、CがControllerです。

そして、MTVとMVCの比較ですが、Mは同じだけどVが違うのでちょっとややこしいかもしれません。

MTV MVC
M(Model) M(Model) サーバサイドのロジック(DB周りも含めて)
T(Template) V(View) 表示部分
V(View) C(Controller) 各処理への要求。C(Controller)の方はURLルーティングも含む。

Djangoのプログラミング開発環境(IDE)について。PyCharm

Djangoのプログラミング開発環境についてです。今回みたいにちょっとDjangoを試すだけなら、統合開発環境(IDE)など使用せずに普段使用しているエディタでも十分だと思います。けどやはりちゃんとDjangoのプログラミング開発をするなら、統合開発環境(IDE)は必須だと思います。

たぶん、Djangoで(というよりPythonで)一番人気がある統合開発環境(IDE)はPyCharmだと思います。他には、Visual Studio Code(VSCode)などもあると思います。

PyCharmは、フリーのCommunity版と有料のPro版があるのですが、公式サイトを見る限り(2022/10/31時点)、Web系の開発やフレームワークを使用する場合はPro版の方が良さそうですし、DjangoのサポートもPro版のみとなっています。
PyCharm Pro と PyCharm Communityの比較 | PyCharm

ただ、個人的にはCommunity版のPyCharmでDjangoプログラミング開発を試した感触としては、Community版でもエディタとしては十分使えるし、デバッグもできて便利でかなり使えるなと感じています (今はDjangoの学習のためにPyCharmを使っているだけなので、今後何かDjangoでウェブアプリをちゃんと開発する段階になったらPro版の使用を検討してみようと思っています。)

ですので、もしもDjango開発を始めたばかりの初心者の方で、何か開発環境(IDE)を使いたいと考えているならPyCharmを試すのもアリだと思います。

PyCharmについては別ページでも書いていますので、試したい方はそちらを参考にしてください。
PyCharmをインスールして、プロジェクトの作成、実行までやってみる【macOS版】
PyCharmでDjango開発時に使用するPythonの設定
PyCharmでDjangoを起動してデバッグする方法

最後に。Django入門者の今後のDjango開発について

以上簡単でしたが、Djangoのインストールと簡単なHTTPリクエスト処理などについて説明しました。

このページで書いた内容は、Djangoの入門中の入門で導入部分だけです。ModelやDBについても全然書いてないですし、Djangoは他にもWebアプリやWeb APIを開発するための多くの機能があって、かつ、シンプルなコードでプログラミングができます(Djangoはフルスタックのフレームワークと言われるぐらいですし)。

もしももっとDjangoを学習したい方やDjangoでWebサイト(Webアプリ)を開発したい方は、本やネットの情報で勉強してDjangoのプログラミング開発をしてみてください。Djangoは人気のフレームワークなので、入門者・初心者向けにも多くの情報があるはずです。初めての人は、体系的に学習的できる入門書の方が良いかもしれません。