【Django入門2】Djangoの全体像・ファイル構成・動作の仕組み

Djangoの全体像とDjangoのウェブアプリが動作する仕組みについての解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは Django の全体像やファイル構成、さらには動作の仕組みについて解説していきたいと思います。特に Django 初心者の方向けの解説となります。

下記ページで解説しているように、Django はウェブアプリケーションフレームワークの1つであり、Django の利用により効率的なウェブアプリ開発を実現することができます。

【Django入門1】Djangoとは?

こういったメリットもある一方で、Django は慣れるまでが大変であるというデメリットもあり、ある程度 Django に慣れるまではむしろ「開発しにくい」と感じることも多いと思います。

そこで、このページでは、Django に慣れるための知識として Django の全体像や動作の仕組みについて解説をしていきたいと思います。

もちろん、Django は大量の Python スクリプトから構成され、さらに多種多様な機能を提供するフレームワークですので、このページのみで Django 全てについて語り尽くすことはできません。ただ、このページを読むことで Django の全体像がボヤッとでも掴むことができ、Django での開発時に「何をやっているか分からない…」という状態は脱却できるようになるのではないかと思います。

是非最後まで読んでみてください!

Django の全体像

では、Django の全体像について解説していきます。

Django = ウェブアプリフレームワーク

まず、Django はウェブアプリフレームワークの1つになります。

こういったフレームワークを利用することで、ウェブアプリを効率的に開発することができるようになります。フレームワークがどういったものであるかや、フレームワークを利用することでアプリ開発が効率的になる理由などは下記で解説していますので、詳しく知りたい方は下記ページを参照していただければと思います。

【Django入門1】Djangoとは?

スポンサーリンク

ウェブアプリとは

では、ウェブアプリとは何でしょうか?

ウェブアプリとは簡単に言えば「リクエストを受け取り、そのリクエストに応じた機能を実行し、その機能から得られた結果に応じたレスポンスを返却するアプリ」のことを言います。

リクエストを送信するのはクライアントであり、ユーザーがクライアントを操作してリクエストを送信することで、ユーザーがウェブアプリの機能を利用することができることになります。このクライアントの代表例はウェブブラウザになります。

また、ウェブアプリでは、リクエストやレスポンスの送受信は HTTP での通信によって行われることになります。なので、リクエストは「HTTP リクエスト」、レスポンスは「HTTP レスポンス」と呼ぶのが正確なのですが、このページでは単にリクエスト・レスポンスと記していきます。

ウェブアプリの役割を示す図

MEMO

Django で開発したウェブアプリの場合、上の図のように直接ウェブアプリがクライアントとデータのやり取りを行うのではなく、他のソフトウェアを経由してクライアントとウェブアプリの間でデータのやり取りが行われることになります

これについては後述で解説します

ウェブアプリの機能とリクエスト

このリクエストの内容やレスポンスの内容はウェブアプリによって異なります。また、通常ウェブアプリで受け付け可能なリクエストの種類は複数存在します。基本的には、ウェブアプリで「リクエスト」と「機能」とは一対一で対応することになり、受け付けたリクエストに応じた機能が動作することになります。

リクエストと機能が1対1で対応する様子

例えば Twitter は「ツイート一覧取得機能」を備えたウェブアプリです。そして、Twitter は「特定のユーザーのツイート一覧を取得したい」というリクエストを受け付け可能になっています。このリクエストを受け付けたウェブアプリは「特定のユーザーのツイート一覧」をデータベースから取得し、その結果をレスポンスとして返却することで、クライアントはユーザーのツイート履歴一覧を得ることができるようになっています。

つまり、Twitter の「ツイート一覧取得機能」は「特定のユーザーのツイート一覧を取得したい」というリクエストを送信することで利用可能ということになります。Twitter の場合は他にもたくさんの機能が存在し、それらの機能を利用するためのリクエストが存在します。例えば「いいね!」ボタンをクリックしたときにもリクエストが送信されることで Twitter の機能が動作していることになります。

こんな感じで、ユーザーがウェブアプリの機能が利用できるのは、クライアントからウェブアプリに対してリクエストが送信されているからになります。ボタンのクリック等でウェブアプリを操作しているように感じる時もありますが、実は裏ではリクエストの送信とレスポンスの受信が行われています。

このようにリクエストの送信によって機能の利用を要求することができる点はウェブアプリの特徴であると言って良いと思います。

クリック等のアプリ操作時にリクエストが送信される様子

ウェブアプリの機能とデータベース

また、上記の例も当てはまるのですが、ウェブアプリに備えられる機能にはデータベースに関連するものが多いです。

Twitter の場合はユーザーの情報やツイートがデータベースに保存されるようになっており、データベースへの新規ツイートの保存により「ツイート投稿機能」が実現できるようになっていますし、データベースからの特定のユーザーのツイート一覧を取得することで「ツイート一覧取得機能」が実現できるようになっています。

ウェブアプリの機能はデータベースを操作するものであることが多いことを示す図

基本的には、ウェブアプリでデータを保存する際にはデータベースを利用すると考えて良いと思います。

また、データベースで管理するデータはウェブアプリによって異なります。データベースで管理するデータがウェブアプリの機能に大きく関わることになるため、より魅力的なウェブアプリの機能を実現するためにデータベースで管理すべきデータをしっかり検討する必要があります。

ウェブアプリの機能とレスポンス

そして、この “機能から得られた結果” はリクエストに対するレスポンスとして返却されてクライアントが受け取ることになります。前述のとおり、ウェブアプリの機能はデータベースの操作によって実現されるものが多く、データベースの操作結果 (成功 or 失敗 or 取得したデータ等) をレスポンスとして返却することが多いです。特にウェブアプリがウェブブラウザから利用される場合は、データベースの操作結果を埋め込んだ HTML がレスポンスとして返却されることになります。

ウェブアプリがレスポンスとしてHTMLを返却する様子

こんな感じで、「リクエストを受け取り、そのリクエストに応じた機能を実行し、その機能から得られた結果に応じたレスポンスを返却するアプリ」がウェブアプリです。

そして、前述のとおり、ウェブアプリの機能はリクエストの送信によって実行されます。また、ウェブアプリの機能はデータベースへの操作によって実現されることが多いです。さらに、ウェブアプリのレスポンスは HTML データであることが多いです。

なので、ウェブアプリの開発では、機能を単に考えるだけでなく下記のようなことを検討し、これらを実装していく必要があります。

  • ①:機能そのもの
  • ②:機能の利用を要求するためのリクエストの内容
  • ③:機能を実現するために必要となるデータベースで管理するデータ
  • ④:機能のレスポンスの内容(HTML の構成など)

詳細については後述で説明しますが、Django で開発するウェブアプリを構成するファイルにおいて、①の実装先は views.py、②の実装先は urls.py、③の実装先は models.py、④の実装先は templates 以下のファイルとなります。

ここを頭に入れておくと、今後の説明が理解しやすくなると思いますので、上記の内容は頭の片隅にでも置いておいてください。

ウェブアプリが動作する環境・ウェブアプリの動作の流れ

Django の詳細を解説する前に、次はウェブアプリが動作する環境や、ウェブアプリの動作の流れについて説明しておきます。

ウェブアプリが動作する環境

ウェブアプリはウェブブラウザ等のクライアントから利用可能なアプリであり、サーバーマシン上からウェブアプリを公開することが一般的です。ウェブアプリがユーザーのウェブブラウザから利用される際のサーバーマシン上のソフトウェアの構成例は下の図のようになります。

基本的に、Django での開発対象となるのは、下の図における “ウェブアプリ” 部分のみとなります。ウェブサーバーや AP サーバーには他の OSS が利用されることが多いです。特に Django 入門者の方は、これらのウェブサーバーや AP サーバーについて深く理解する必要もないですが、ウェブアプリが他の上位のサーバーからリクエストを受け取って動作することは覚えておきましょう!

ウェブアプリ公開時のソフトウェア構成の一例

以降では、ウェブアプリが利用される際の、ウェブサーバー・AP サーバー・そしてウェブアプリの動作の流れを簡単に説明していきます。

一点補足しておくと、上の図ではウェブブラウザがウェブアプリを利用する例を示していますが、ウェブアプリは専用のアプリ(スマホアプリ等)から利用されることも多いです。例えば Twitter や Facebook などは専用のスマホアプリから利用可能ですよね。もちろん、Django で開発したウェブアプリも、自身で専用のスマホアプリを開発すれば、そのアプリから利用することは可能です。ですが、最初はウェブブラウザから利用することを前提に学習していった方が分かりやすいと思いますので、このサイトでは、ウェブアプリはウェブブラウザから利用されることを前提に解説を進めていきたいと思います。

ウェブサーバーがリクエストを受け取る

まず、ユーザーはウェブアプリの機能を利用するためにリクエストの送信を行う必要があります。このリクエストは、ウェブブラウザのアドレスバーに URL を指定したり、リンク先の URL が指定されたリンクテキストをクリックしたりすることで送信できます。

ウェブブラウザからのリクエスト送信手段を示す図

これらの操作によって送信されるリクエストは、厳密には HTTP リクエストと呼ばれ、下図のような構成のデータとなります。ポイントになるのが破線で囲っている部分で、青の破線部分は “メソッド”、オレンジの破線部分は “URL” となります。ちなみに、リクエストのデータの URL はルートパス指定(ドメイン名などを省略した URL の指定方法)で記述されることが多いです。

HTTPリクエストのデータ構造

ポイントは、メソッドと URL の2つで「利用したいウェブアプリの機能」が指定されるという点になります。したがって、ウェブアプリは、リクエストを受け取った際には、メソッドと URL に応じた機能を実行する必要があります。

また、これらの操作によってウェブブラウザ等のクライアントから送信されたリクエストはウェブサーバーが受け取ることになります。

ウェブサーバーがリクエストを受け取る様子

例えば、ウェブブラウザのアドレスバーに http://daeudaeu.com/users/ という URL を指定した場合、daeudaeu.com のドメイン名に対応するサーバーマシンで動作しているウェブサーバーにリクエストが送信されることになります。そして、ウェブサーバーが受け取るリクエストのメソッド・URL は下図のようなものになります。このように、リクエストの送信先に関しては URL のドメイン名で決まります。そして、ルートパス指定の URL がリクエストのデータに指定されることになります。また、ウェブブラウザのアドレスバーに URL を指定した場合は、(おそらく)必ずメソッドは GET となります。

ウェブサーバーが受け取るリクエストの具体例

ウェブアプリがリクエストに応じた機能を実行する

そして、ウェブサーバーから AP サーバーを経由してウェブアプリがリクエストを受け取ることになります。そして、このウェブアプリがリクエストに応じた機能を実行することになります。この時に実行される機能は、前述で説明したようにメソッドと URL に基づいて決定されます。

ウェブアプリが受け取ったリクエストのメソッドとURLに応じた機能を実行する様子

例えば、ウェブブラウザのアドレスバーに http://daeudaeu.com/users/ という URL が指定された場合、ウェブサーバー等を介してウェブアプリにリクエストが渡され、ウェブアプリは、メソッド (GET) と URL (/users/) に対応した機能を実行することになります。

例えば、GET /users/ のリクエストが「ウェブアプリ利用者一覧の取得」機能の利用を要求するものであれば、ウェブアプリはデータベースからウェブアプリの利用者一覧のデータを取得するような処理を実行することになります。

ウェブアプリがメソッドとURLに応じた機能を実行する例

こんな感じで、ウェブアプリは受け取ったリクエストのメソッドと URL に応じた機能を実行します。

ウェブサーバーがレスポンスを返却する

さらに、機能の実行結果に基づいたレスポンスをウェブアプリが AP サーバーに返却することになります。そして、AP サーバーからウェブサーバーにレスポンスが返却され、そのレスポンスをウェブサーバーがクライアント(ウェブブラウザ)に対して返却することになります。

機能の結果に基づいたレスポンスがクライアントに返却される様子

これにより、ウェブブラウザがレスポンスを受け取り、そのレスポンスに基づいたページの描画が行われます。例えば、GET /users/ のリクエストが「ウェブアプリ利用者一覧の取得」機能の利用を要求するものであれば、ウェブアプリ利用者一覧を含む HTML がウェブアプリからレスポンスとして返却され、それを受け取ったクライアントが、その HTML に基づいてページを描画することになります。そして、ユーザーが、そのページからウェブアプリ利用者一覧を確認することが出来ることになります。

ウェブアプリがレスポンスを返却する例

こここまでの説明のとおり、ウェブアプリでは、上位のサーバーから受け取ったリクエストに応じた機能・処理を実行し、その結果をレスポンスとして返却することが重要となります。クライアントから送信されてくるリクエストは、機能の利用を要求するデータなので、これを無視してウェブアプリ動作するとクライアントの要求が満たされないことになります。クライアントの要求を満たすためには、リクエストに応じた機能・処理を実行し、その結果をレスポンスとして返却する流れが必要となります。

メソッドと URL についての補足

ここで、リクエストに含まれるメソッドと URL について補足しておきます。

前述のとおり、メソッドと URL は「利用したい機能」を指定するデータとなります。そして、このメソッドとして指定可能な文字列としては下記のようなものが挙げられます。他にもさまざまな種類のメソッドが存在するのですが、まずは下記の3つ、特に GETPOST を覚えておくとよいと思います。

  • GET : データの取得
  • POST : データの新規作成・データの送信
  • DELETE : データの削除

これらのメソッドは、ウェブアプリを利用して「どうしたいのか?」という “リクエストの目的” を伝えるデータとなります。それに対して URL は 「何に対するリクエストなのか?」という “リクエスト対象のリソース” を伝えるデータとなります。そして、メソッドと URL を組み合わせることによって「何をどうしたいのか?」という “利用したい機能” を伝えるためのデータとなります。

例えば、/comment/ という URL がコメントというリソースを示すのであれば、GET /comment/ のリクエストは「コメントを取得したい」となり、このリクエストを受け取ったウェブアプリは、そのリクエストに応えるために「コメント取得機能 」を実行する必要があります。それに対し、POST /comment/ のリクエストは「コメントを新規作成したい」となり、このリクエストを受け取ったウェブアプリは、そのリクエストに応えるために「コメント投稿機能」を実行する必要があります。

こんな感じで、リクエストのメソッドと URL で「何をどうしたいのか?」というクライアント(ユーザー)の要求が伝えられることになるため、ここまでの説明のとおり、ウェブアプリは、その要求に対応した機能を実行する必要があります。

開発用ウェブサーバーでのウェブアプリの動作確認

さて、ここまではウェブアプリが下の図のようなソフトウェアの構成の中で動作すると説明してきました。ただ、これはウェブアプリ公開後のソフトウェアの構成となります。つまり、Django でのウェブアプリ開発中の動作確認では、下図とは異なる構成でウェブアプリを動作させることになります。

ウェブアプリ公開時のソフトウェア構成の一例

具体的には、Django でのウェブアプリ開発時には、Django から提供される「開発用ウェブサーバー」を利用してウェブアプリを動作させることになります。次は、この開発用ウェブサーバーについて簡単に紹介しておきます。

開発用ウェブサーバーとは

前述の通り、ウェブアプリは他のサーバーから実行されることで動作することになります。前述では AP サーバーからウェブアプリが実行される構成を紹介しましたね!

ただ、ウェブアプリの公開時に他のサーバーを用意するのは仕方ないとしても、お試しでのウェブアプリの実行や、開発時の動作確認ためにわざわざ他のサーバーを用意するのは面倒です。

この面倒さを解消するため、Django では開発用ウェブサーバーが用意されており、これが前述のウェブサーバーや AP サーバー等の代わりとなるようになっています。したがって、動作確認のためにウェブアプリを動作させるのに他のサーバーをわざわざ用意する必要がなく、Django さえインストールしておけば開発用ウェブサーバーを利用してウェブアプリを動作させることができます。

開発用ウェブサーバー利用時のソフトウェア構成

この開発用ウェブサーバーを利用した時の構成は下の図のようになります(開発用ウェブサーバーは Django フレームワークの一部と言っても良いかもしれませんが、このページではこれらを別のものとして扱って説明していきたいと思います)。

開発用ウェブサーバーを利用したウェブアプリの動作環境

ウェブアプリの動作確認時には、リクエストの送信やレスポンスの受信を行うクライアント(ウェブブラウザ等)も同じ PC 上で動作させることが多いため、上の図のように1つの PC 上で動作する構成を示しています。

開発用ウェブサーバーを利用する構成においては、ウェブブラウザ等のクライアントからの「リクエストの受信」やクライアントへの「レスポンスの返却」に関しては開発用ウェブサーバーの役割となります。リクエストを受け取った際には、開発用サーバーはウェブアプリを実行し、この際にウェブアプリへリクエストを渡します。そして、ウェブアプリから返却されたレスポンスをウェブブラウザ等のクライアントに返却してくれます。

そのため、Django では開発用ウェブサーバーの起動をしておくだけで「開発中のウェブアプリの動作確認」を行うことができることになります。基本的には、Django を利用したウェブアプリ開発においては、上図に示すような開発用ウェブサーバーを利用した構成で開発を行なっていくことになります。

ただし、開発用ウェブサーバーは、あくまでも Django で開発するウェブアプリの動作確認用に利用されるサーバーであり、ウェブアプリ公開時には利用されません。そのため、ウェブアプリが完成して公開する際には、ウェブアプリが動作する環境・ウェブアプリの動作の流れ で示したようなウェブサーバーや AP サーバー等を利用する構成(本番環境)に移行する必要があります。

スポンサーリンク

Django で開発するウェブアプリ内部の構成

ここまでは、他のソフトウェアとの関係性を示す形でウェブアプリの全体像を解説してきました。

ここからは、ウェブアプリに注目し、Django で開発するウェブアプリ内部の構成について説明していきたいと思います。

ウェブアプリに注目する様子

ウェブアプリの構成

Django で開発するウェブアプリの構成を簡単に示したものが下図となります。

Djangoで開発するウェブアプリの構成を示す図

Django を利用して開発するウェブアプリは大きく2つの部分から構成されます。1つ目はフレームワーク、つまり Django であり、2つ目はプロジェクトになります。1つ目の部分は単に Django と記しても良いかもしれませんが、フレームワークであることを意識していただきたいため、Django フレームワークと記していきたいと思います。

この2つは役割が大きく異なり、Django フレームワークの役割は「ウェブアプリで共通的な機能を提供する」ことであり、プロジェクトの役割は「開発するウェブアプリ特有の機能を提供する」ことになります。

Django フレームワーク

前者の Django フレームワークは、下記ページでも解説しているとおり、ウェブアプリにおける共通的な機能や構造を提供する枠組みとなります。

【Django入門1】Djangoとは?

ここまで説明してきた通り、ウェブアプリではリクエストを受け付ける機能が必ず必要になります。またデータベース操作機能が必要となる場合も多いです。他にもログイン等を実現するために認証機能を備えているウェブアプリが多いです。こういったウェブアプリで一般的に共通して利用される機能が Django フレームワークから提供されるようになっています(下図では共通的な機能を青四角で4つのみ記載していますが、他にも多くの機能が存在します)。

フレームワークがウェブアプリで共通的に利用される機能を提供する様子

つまり、Django フレームワークの機能を利用するだけで、上記のようなウェブアプリで共通となる処理や動作を実現することができます。この Django フレームワークは Django をインストールすることで自動的に PC 内に構築され、Django で開発するウェブアプリにおいて共通的に利用されるものになります。

プロジェクトからDjangoフレームワークの機能を利用する様子

プロジェクト

Django フレームワークがウェブアプリで共通的な機能を提供するのに対し、プロジェクトは、そのウェブアプリ特有の機能を提供する部分になります。Django を利用する場合、開発者の主な開発対象は、このプロジェクトのみとなります。Django フレームワークに関しては、そのまま利用します。

プロジェクトの役割を示す図

このプロジェクトで主に行うことは、そのウェブアプリ特有の機能の実装となります。この機能を充実させていくことで、他のウェブアプリにはない特徴を生み出したり、他のウェブアプリよりも使いやすいウェブアプリを実現したりすることができます。要は、このプロジェクトを作りこんでいくことで他のウェブアプリとの差別化を図っていくことになります。そして、Django では、基本的にプロジェクト内の開発のみを行うため、Django を利用すれば、他のウェブアプリとの差別化に注力することができることになります。

また、ウェブアプリで共通的に必要となる Django フレームワークの機能は、プロジェクト内のファイルからも利用することが可能です。ですので、例えばプロジェクト内のファイルにデータベース操作の処理を自身で実装しなくても、Django のフレームワークの機能を利用するように実装するだけで、データベース操作を実現することができます。Django では、こういった Django フレームワークの機能も利用しながら効率的にプロジェクトを開発していくことが可能です。

ただし、Django フレームワークの使い方(例えば Django フレームワークの関数を実行する順番や実行時に渡す引数など)に関しては、開発者自身が開発対象のウェブアプリに合わせて考える必要があります。

逆に、プロジェクト内のファイルや、それらのファイルで定義した関数が Django フレームワークから利用されることもあります。そのため、これらは Django フレームワークが期待する構成で作成していく必要があります。

Django フレームワークとプロジェクトにおけるファイル位置の関係

ここで1点補足しておくと、ウェブアプリの構成が下の図のようになると考えられるのは「動作的な構成」で考えた場合となります。

フレームワークがウェブアプリで共通的に利用される機能を提供する様子

実際には、Django フレームワークとプロジェクトのファイルは別々の場所にあるので注意してください。

Django フレームワークを構成するファイルは Django 自体のインストール先のフォルダ内に存在します。この Django フレームワークが存在する位置に関しては環境等によって異なるので一概には言えないのですが、例えば私の環境であれば下記フォルダ以下に Django フレームワークを構成するファイルが存在しています。

/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django

それに対し、プロジェクトのファイルは、後述の Django のプロジェクトの作り方・ウェブアプリの動かし方 で紹介するコマンドによって自動的に生成されるもので、好きな場所に作成することができます。例えばドキュメントフォルダの下やデスクトップに作成することが多いと思います。

つまり、Django フレームワークとプロジェクトのファイルは全く別々の場所に存在することになります。

Djangoフレームワークとプロジェクトの存在する位置が異なることを示す図

ですが、動作的に考えると、プロジェクト内のファイルから Django フレームワーク内のファイルで定義される関数を実行したり、逆に Django フレームワーク内のファイルからプロジェクト内のファイルで定義された関数が実行されたりするため、先ほど示した Django フレームワークがプロジェクトを囲う形の構成がしっくりくるのではないかと思います。

Django のプロジェクトの構成

さて、先ほど Django で開発するウェブアプリは Django フレームワークとプロジェクトの2つから構成されると説明しました。

前者の Django フレームワークに関しては、基本的にインストールされたものをそのまま利用することになり、開発者は主に、後者のプロジェクト内のファイルを編集していくことでウェブアプリを開発していくことになります。

MEMO

基本的に Django フレームワークを直接変更することはありませんが、プロジェクト内のファイルによって Django フレームワークの動作の設定を行うことが可能です

これの詳細に関しては、後述の Django のプロジェクトの作り方・ウェブアプリの動かし方 で解説します

次は、このプロジェクトに焦点を当て、プロジェクトを構成するファイル・フォルダの構成および、各ファイルの役割について解説していきます。

プロジェクトに注目する様子

プロジェクト内のファイル

Django において、プロジェクトの実体はフォルダとなります。

プロジェクトを構成するファイル・フォルダ

そして、このプロジェクト内には下図のようなファイルやフォルダが存在します(__init__.py は省略しています)。プロジェクトの中に「プロジェクト名 フォルダ」があってややこしいので、以降では、プロジェクトの内側に存在する「プロジェクト名 フォルダ」のことを プロジェクト設定フォルダ と呼ばせていただきます。

プロジェクトを構成するファイル・フォルダ

Django を利用したウェブアプリ開発では、主にこれらのファイルを変更することでウェブアプリを開発していくことになります。また、これらのファイルやフォルダは、基本的には後述の Django のプロジェクトの作り方・ウェブアプリの動かし方 で紹介するコマンドを実行することで自動的に生成されるものになりますが、一部のピンク色の文字で示したファイルやフォルダに関しては自動生成されないため、開発者自身が手動で作成する必要があります。

各ファイル・各フォルダの役割

上の図で示す各フォルダ・各ファイルの役割を簡単に記すと下記のようになります。

  • manage.py:Django 向けのコマンドを実行するスクリプトファイル★
  • プロジェクト設定フォルダ:プロジェクトの設定ファイルを格納するフォルダ
    • __init__.py:Python に プロジェクト名 フォルダをパッケージとして認識させるためのファイル
    • settings.py:Django フレームワークの動作を設定するファイル★
    • urls.py:URL とアプリとの対応付けを定義するファイル
    • wsgi.py:サーバーとのインターフェースを定義するファイル(WSGI 用)
    • asgi.py:サーバーとのインターフェースを定義するファイル(ASGI 用)
  • アプリ名 フォルダ:アプリを構成するファイルを格納するフォルダ
    • __init__.py:Python に アプリ名 フォルダをパッケージとして認識させるためのファイル
    • apps.py:アプリ独自の設定ファイル
    • views.py:アプリの機能を実装するファイル(MTV の View)
    • models.py:データベースで管理するデータの定義・データベース操作を実装するファイル(MTV における Model )
    • forms.py:データの送信フォームを実装するファイル
    • admin.py:管理画面用の設定ファイル
    • tests.py:テスト用のファイル
    • urls.py:URL と関数との対応付けを定義するファイル
    • migration フォルダ:マイグレーションの設定ファイルを格納するフォルダ
      • __init__.py:Python に migrations フォルダをパッケージとして認識させるためのファイル
    • templates フォルダ:HTML のテンプレートファイルを提供するフォルダ(MTV における Templat)
      • xxx.html 等:テンプレートファイル(複数のファイル用意)

たくさんのファイルが存在しますが、この中で特に重要になるのが太字で示した views.pymodels.pytemplates フォルダ以下 のファイル、そして urls.py となります。これらはウェブアプリの機能を実現していく上で変更・作成が必要となるファイル群となります。これらのファイルについては、後述の ウェブアプリの機能を実現するファイル で詳細を説明していきます。

MEMO

機能を実現する上では forms.py も重要なファイルとなります

forms.py に関しては、別途下記のページで詳細な解説を行います

Djangoのフォームの解説ページアイキャッチ 【Django入門5】フォームの基本

また、ウェブアプリを開発する・ウェブアプリを動かすという観点では、★マークを付けた manage.pysettings.py の2つのファイルも重要となります。この2つに関しては、後述の Django のプロジェクトの作り方・ウェブアプリの動かし方 の中で説明をしたいと思います。

スポンサーリンク

プロジェクト・プロジェクト設定・アプリの関係

ここまでの説明のように、プロジェクトはフォルダであり、そのフォルダ内に プロジェクト設定フォルダアプリフォルダ が存在することになります。ここで、これらのフォルダの関係性について解説しておきます。

プロジェクト:プロジェクト設定とアプリをまとめたフォルダ

まず「プロジェクト」はウェブアプリの一部になります。Django フレームワークと連携して動作させることでウェブアプリが実現できることになります。そして、このプロジェクトは1つの プロジェクト設定フォルダ 1つ or 複数の アプリフォルダ から構成されます。

プロジェクトの構成の説明図

アプリ:ウェブアプリ特有の機能を実現するフォルダ

続いて アプリフォルダ について説明すると、アプリフォルダ開発するウェブアプリ特有の動作や機能を実現していくためのフォルダとなります。このフォルダ内に MTV モデルを形成するファイルが存在し、これらを作りこんでいくことで世界で一つだけのウェブアプリを開発することが出来ます。

この アプリフォルダ はプロジェクト内に複数存在させることもでき、1つの アプリフォルダ で1つのウェブアプリとして仕上げることもできますし、複数の アプリフォルダ 内のファイルを連携動作させることで1つのウェブアプリとして仕上げていくこともできます。

アプリの説明図

複数の アプリフォルダ から1つのウェブアプリを開発するメリットとしては「他のプロジェクトへの機能の流用が容易になる」が挙げられます。要は、他のプロジェクトへの機能の使い回しが楽に実現できます。例えば、ウェブアプリの機能のうち “ログイン機能のみ” を切り離して1つの アプリフォルダ として開発すれば、そのログイン機能の他のプロジェクトへの流用が容易になります。なぜなら、その流用は、その アプリフォルダ のコピーのみで実現できるからです。

アプリの流用についての説明図

逆に、ウェブアプリの全機能を1つの アプリフォルダ 内で実現してしまうと、機能の他のプロジェクトへの流用が大変になります。この場合、各種ソースコードから、その機能に関連する部分のみを全てをコピペするようなことが必要になって手間が多くなりますし、コピペの漏れなどがあるとバグが発生する可能性もあります。なので、他のウェブアプリ(プロジェクト)でも使うことがありそうな機能に関しては、他の機能とは分離して別の アプリフォルダ で開発することをオススメします。

プロジェクト設定:フレームワークの動作を設定するフォルダ

アプリフォルダ がウェブアプリ特有の機能を実現するフォルダであるのに対し、プロジェクト設定フォルダ は共通機能を提供する Django フレームワーク側の動作を設定するためのフォルダと考えて良いです。言い方を変えれば、プロジェクト内の「アプリ」共通の設定を行う部分とも言えます。Django フレームワーク自体を変更することは非推奨ですが、このプロジェクト設定フォルダ内のファイルを編集することで、Django フレームワークの動作を変化させることができます。

プロジェクト設定の説明図

例えばですが、プロジェクト設定フォルダsettings.py では使用するデータベースの設定を行うことができます。settings.py のデフォルト設定では使用するデータベースとして「SQLite3」が指定されていますが、settings.py を変更して使用するデータベースに「MySQL」を指定すれば、プロジェクト内の「アプリ」から Django フレームワークのデータベース操作機能を利用した際、データベース操作機能はデータベースとして MySQL を使用するようになります。

プロジェクト設定によるフレームワークの設定変更の例

他にも、言語設定やタイムゾーンの設定等も settings.py によって変更可能です。

ただし、プロジェクト設定フォルダ はプロジェクト内の アプリフォルダ 全てに対する共通の設定となります。なので、Django フレームワークの機能の設定を アプリフォルダ ごとに変更したい場合は、それらの アプリフォルダ は別々の「プロジェクト」に分けて開発した方が良いと思います。

まずは、難しく考えずにプロジェクトの中には1つの アプリフォルダ のみを作成してウェブアプリを開発していくので良いと思います。ただし、アプリフォルダ はプロジェクト内に複数作成可能であること、また機能ごとに アプリフォルダ を設けることで機能のほかのプロジェクトへの流用が容易になることは覚えておきましょう!

ウェブアプリの機能を実現するファイル

続いて、特にウェブアプリの機能を実現していく上で重要となるファイルの説明を行っていきます。

ウェブアプリとは の節でウェブアプリの開発では下記を実装していく必要があると説明しました。そして、これらの実装先は、①が views.py、②が urls.py、③が models.py、④が templates フォルダ以下 のファイルとなります。そのため、Django でのウェブアプリの開発においては、これらの4つのファイルが重要となります。

  • ①:機能そのもの
  • ②:機能の利用を要求するためのリクエストの内容
  • ③:機能を実現するために必要となるデータベースで管理するデータ
  • ④:機能のレスポンスの内容(HTML の構成など)

特に、views.pymodels.pytemplates フォルダ以下のファイルに関しては、それぞれ下記ページでも解説している MTV モデルの View・Model・Template を実装していくファイルとなります。そして、Django を利用する場合、主に、この MTV を、つまり views.pymodels.pytemplates フォルダ以下 のファイルを作りこんでいくことでウェブアプリを開発していくことになります。なので、これらの3つのファイルは超重要なファイルとなります。

【Django入門1】Djangoとは?

もう1つ重要となるファイルが urls.py です。この urls.py では、ウェブアプリで受け付け可能な URL の定義と、それらの URL と関数との紐づけを行います。つまり、ウェブアプリでどんな URL のリクエストを受け付け、そのリクエストを受け取ったときに何を実行するのかを定義するファイルが urls.py となります。なので、この urls.py もウェブアプリの開発において重要なファイルとなります。この urls.py は プロジェクト名 フォルダと アプリ名 フォルダの2か所に存在しますが、これらの意味合いについても解説していきます。

urls.py

最初に urls.py について説明していきます。

urls.py の役割

urls.py は、ウェブアプリで受け付けるリクエストの URL の定義と、その URL を受け付けたときに実行する関数とのマッピング(対応付け)を行うファイルになります。このページでは、オブジェクトが関数であることを前提に解説を進めます。

MEMO

views.py をクラスを利用して開発する場合、urls.py では URL とクラスとのマッピングを行うことになります

このあたりの詳細は、Django 入門 の後半で解説していきます

ウェブアプリが動作する環境・ウェブアプリの動作の流れ でも説明したように、ウェブアプリでは受け取ったリクエストのメソッドと URL に応じた機能を実行する必要があります。また、これは後述でも解説しますが、この機能は views.py に関数(or クラス)として定義されることになります。これらの views.py の関数と、リクエストの URL とのマッピングを行うのが、ここで説明する urls.py の役割となります。ちなみに、メソッドに応じて実行する機能を切り替えるのは View (views.py) の役割になります。これについては views.py の節で解説します。

urls.pyの役割を具体的に示した図

このマッピングを行っておくことで、特定の URL に対するリクエストをウェブアプリが受け取った時に、その URL にマッピングされた関数が自動的に実行されるようになります。

urls.py での URL と関数とのマッピング

この「URL と関数とのマッピング」は、urls.py で  path 関数の返却値を要素とする urlpatterns というリストを定義することで実現できます。path 関数の第1引数には「ウェブアプリが受け付ける URL」を指定し、第2引数には「その URL のリクエストを受け取った時に実行する関数」を指定します。

イメージとしては、urls.py は下記のような構成となります。例えば下記であれば、URL が URL1URL2URL3 のリクエストをウェブアプリが受け取った場合に、それぞれ 関数1関数2関数3 が実行されることになります。

urls.pyの設定例
from django.urls import path

urlpatterns = [
    path('URL1', 関数1),
    path('URL2', 関数2),
    path('URL3', 関数3),
]

ウェブアプリが受け付ける URL の定義

この urls.py では、ウェブアプリが受け付け可能な URL を定義することも兼ねている点もポイントとなります。

つまり、関数とのマッピングを行った URL、すなわち path の第1引数に指定された URL のみがウェブアプリが受け付け可能な URL として定義されることになります。それ以外の URL は、ウェブアプリは受け付け不可となり、その URL を受け取った場合はエラーとなります(404 エラー)。

urls.pyで関数にマッピングしたURLのみがウェブアプリで受付可能なURLとなることを示す図

リクエストを受け取ったときに関数が実行される流れ

次は、リクエストを受け取った時に関数が実行される流れについて簡単に説明しておきたいと思います。これを理解しておけば urls.py の必要性も理解できると思います。

ウェブアプリが動作する環境・ウェブアプリの動作の流れ でも説明したように、ウェブアプリは他のサーバーソフトウェアからリクエストを受け取ることになります。このリクエストは Django フレームワークに渡され、そして、Django フレームワークがリクエストの URL に応じて実行する関数を決め、その関数を実際に実行することになります。

MEMO

もっと正確に言うと、他のサーバーソフトウェアからのリクエストは、wsgi.py を介して Django フレームワークが受け取ることになります

この辺りに関しては Django のウェブアプリ内部の動作の流れ の章で簡単に説明します

なんですが、Django フレームワークは第三者が開発した全ウェブアプリでの共通部分です。なので、あなたが開発するウェブアプリがどんな URL を受け付け、その URL を受け取った時に何の関数を実行すれば良いのかを知りません。そのため、ウェブアプリが受け付け可能な URL と、それらの URL を受け取った時に実行する関数を、あなたが Django フレームワークに教えてあげる必要があります。

そして、それらを教えるためのファイルが urls.py になります。ウェブアプリが起動した際には、Django フレームワークから、この urls.py が読み込まれることになります。そして、この読み込みによって、そのウェブアプリが受け付ける URL と、その URL にマッピングされた機能を Django フレームワークが理解することになります。

Djangpフレームワークがurls.pyを読み込む様子

そして、後は Django フレームワークがリクエストを受け取った時に、それに対応する関数を Django フレームワークが実行してくれるようになります。

逆に、urls.py が存在しないと、Django フレームワークは、ウェブアプリで受け付け可能な URL も、リクエストを受け取った時に実行すべき関数も分からなくなり、基本的には何もしないウェブアプリになってしまうことになります。

ということで、この urls.py は Django でのウェブアプリにおいて非常に重要なファイルとなります。

プロジェクトとアプリの urls.py

urls.py の解説の最後に、プロジェクト設定フォルダurls.pyアプリフォルダurls.py について解説しておきます。

urls.pyプロジェクト設定フォルダアプリフォルダ に存在します。今後は、前者を プロジェクト/urls.py、後者を アプリ/urls.py と呼ばせていただきます。

簡単に2つの urls.py の役割を説明すると、アプリ/urls.py は、そのアプリ内の関数と URL とのマッピングを行うことが役割で、プロジェクト/urls.py は、Django フレームワークに対し、アプリ/urls.py を読み込むように指示(設定)を行うことが役割となります。前述の説明で、Django フレームワークから urls.py が読み込まれると説明しましたが、この読み込み先のファイルはデフォルトでは プロジェクト/urls.py のみとなります。

デフォルトでのDjangoフレームワークからのurls.pyの読み込み

ですが、プロジェクト/urls.py で Django フレームワークに対して アプリ/urls.py を読み込むように指示(設定)を行うことができ、これによって アプリ/urls.py も読み込ませることができるようになります。

プロジェクト設定のurls.pyから他のurls.pyを読み込むように指示したときのDjangoフレームワークの動作を示す図

このように プロジェクト/urls.py と アプリ/urls.py を作成することで、各 アプリフォルダ 内で実装する関数の URL へのマッピングも アプリフォルダ 内のファイルの編集のみで実現できるようになります。そして、これによって、プロジェクトとアプリ間の依存を減らし、他のプロジェクトへの機能の流用が容易になります。

プロジェクト/urls.py だけでなく アプリ/urls.py も設置する場合 、プロジェクト/urls.py は下記のように実装する必要があります。urlpatterns の1つ目の要素は自動生成時に記述されたものなので、まずは無視していただければと思います。この プロジェクト/urls.py のポイントは、基本的な構造に関しては前述で示した urls.py と同じなのですが、path の第2引数で機能となる関数等を指定するのではなく、include 関数を実行している点になります。

プロジェクト/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls)
    path('アプリ1を示す文字列/', include('アプリ1.urls'))
    path('アプリ2を示す文字列/', include('アプリ2.urls'))
]

このように、path の第2引数で include 関数を実行するようにすれば、第1引数で指定された文字列で始まる URL のリクエストを受け取った際には、include 関数の引数に指定した urls.py に従って URL と関数をマッピングするように Django フレームワークを設定することができます。具体的には、include 関数の引数に 'アプリ名.urls' を指定した場合、アプリ名 フォルダの下の urls.py、すなわち アプリ/urls.py が読み込まれ、その内容に従ってマッピングが行われることになります。 

つまり、リクエストの URL が /アプリ1を示す文字列/ から始まる場合に アプリ1 フォルダの下の urls.py の内容に従って URL と関数とのマッピングが行われ、リクエストの URL が /アプリ2を示す文字列/ から始まる場合に アプリ2 フォルダの下の urls.py の内容に従って URL と関数とのマッピングが行われることになります。

URLの先頭の文字列によって参照先のurls.pyが変化する様子

そして、アプリ/urls.py の具体例は下記のようになります。こちらに関しては、今まで説明してきた通り、path 関数の第1引数には「ウェブアプリが受け付けるリクエストの URL」を指定し、第2引数には「その URL のリクエストを受け取ったときに実行する関数」を指定します。下記は、views.pysignup 関数と login 関数が定義されていることを前提とした例となっています。

アプリ/urls.py
from django.urls import path
from testapp import views

urlpatterns = [
    path('signup/', views.signup),
    path('login/', views.login),
]

上記の アプリ/urls.pyアプリ1 フォルダの下の urls.pyとすれば、上記による URL と関数のマッピングは、リクエストの URL が /アプリ1を示す文字列/ から始まる場合のみ適用されることになります。したがって、リクエストの URL が /アプリ1を示す文字列/signup/ の場合に views.signup が実行されることになります。

こんな感じで、ウェブアプリの受け付けるリクエストは プロジェクト/urls.py と アプリ/urls.pypath 関数の第1引数で指定した文字列を結合した URL となるので注意してください。

とりあえず、このページでの urls.py に関しての説明は以上となります。この urls.py に関しては次の連載となる下記ページで詳細を解説していますので、下記ページでより深く学んでいきましょう!

Djangoのビューの機能についての解説ページアイキャッチ 【Django入門3】ビュー(View)の基本とURLのマッピング

スポンサーリンク

views.py

次に、views.py について説明していきます。

views.py の役割

views.py は、前述のとおり MTV モデルにおける View に該当するファイルであり、ウェブアプリの機能を実装するファイルとなります。言い換えれば、ウェブアプリの機能を提供するファイルとなります。

つまり、views.py で実装した関数(or クラス)が “ウェブアプリの機能” に該当することになり、そして、ウェブアプリがリクエストを受け付けた際に、これらの関数やクラスが実行されることで、リクエスト送信元のクライアントが機能を利用することができることになります。

views.pyの役割を示す図

urls.py の節で説明したように、リクエストを受け付けた際に実行される関数は urls.py で URL と対応付けされることになりますが、この関数に該当するのが views.py で定義する関数となります。

また、views.py はクラスを利用して実装することも可能なのでですが、ここでは関数で実装することを前提に解説を進めます。

views.py の作り方

views.py はウェブアプリの機能を実装するファイルなので、基本的には自身で開発したいウェブアプリの機能に合わせて自身の好きなように関数を実装していけばよいことになります。また、ウェブアプリには複数の機能が備えられることが多いので、views.py には複数の関数を実装することになると思います。

ただ、views.py で実装する関数には守るべき最低限のルールが存在します。それが下記となります。

  • 引数で “リクエスト” を受け取ること
  • 正常終了時には返却値で “レスポンス” を返却すること
  • 異常が発生したときには例外を発生させること

この “リクエスト” とは、Django フレームワークで定義される HttpRequest のサブクラスのインスタンス(オブジェクト)であり、“レスポンス” とは Django フレームワークで定義される HttpResponse のサブクラスのインスタンス(オブジェクト)になります。サブクラスと書いていますが、別に HttpRequest そのもの or HttpResponse そのもののインスタンスであっても良いです。

上記のようなルールが存在するのは、この views.py で定義する関数が Django フレームワークから実行されるためです。urls.py の節でも説明したように、urls.py によって関連付けられた関数は Django フレームワークから実行されることになります。

そして、この Django フレームワークは、関数を実行するときに引数として HttpResponse のサブクラスのインスタンスを指定し、関数から返却された返却値を HttpResponse のサブクラスのインスタンスとして扱うようになっています。

views.pyの関数の呼び出し元の動作を示した図

また、views.py で定義する関数の実行時に異常が発生したときは例外を受け取ることを前提とした作りになっています。このように Django フレームワークが作られているため、Django フレームワークから実行される関数は Django フレームワークに合わせて作成する必要があります。これは、上記のようなルールで関数を実装することで満たすこができます。

MEMO

urls.py で URL にマッピングされていない関数は Django フレームワークからは直接実行されないため、上記のルールを満たす必要はありません

逆に言えば、上記の3つのルールさえ満たせば、この views.py は Django におけるウェブアプリの機能として成立することになります。

つまり、下記のような index 関数でも、Django におけるウェブアプリの機能として成立することになります。この index 関数では、関数内では使用していませんが、仮引数 request を指定しておくことで HttpRequest のサブクラスのインスタンスを受け取りることができるようになっています。そして、HttpResponse クラスのコンストラクタを実行して HttpResponse のインスタンスを生成し、それを返却しています。例外は発生しない作りとしていますが、上記のルールを満たした関数となります。

views.pyの一番簡単な例
from django.http.response import HttpResponse

def index(request):
    return HttpResponse('Hello World')

この index 関数が Django フレームワークから実行されれば、HttpResponse クラスのインスタンスが Django フレームワークに返却され、Django フレームワークを経由して Hello World をボディとしたレスポンスがクライアントに返却されることになります。クライアントがウェブブラウザであれば、Hello World が画面に表示されることになります。

つまり、超簡単になりますが、ウェブアプリとしては機能することになります。

このように、ウェブアプリの機能となる views.py の関数は、HttpRequest のサブクラスのインスタンスを受け取るための仮引数を持ち、さらに HttpResponse のサブクラスのインスタンスを返却するように実装する必要があることは重要なポイントになるので覚えておきましょう!

メソッドに応じた処理の切り替え

もう1つ、views.py で定義する関数でポイントになるのが、リクエストのメソッドに応じた処理の切り替えが必要になるという点になります。

ウェブアプリが動作する環境・ウェブアプリの動作の流れ でも説明したように、ウェブアプリでは受け取ったリクエストのメソッドと URL に応じた機能を実行する必要があります。この URL に応じた機能の実行は、urls.py の節でも解説したように urls.py によって実現できることになります。

それに対し、メソッドに応じた機能の実行に関しては views.py によって実現する必要があります。つまり、views.py で定義する関数では、リクエストのメソッドに応じて実行する処理を切り替える必要があることになります。

で、これを実現するために、引数として渡される HttpRequest のサブクラスのインスタンスを利用することになります。このインスタンスのデータ属性 method には、リクエストのメソッドが文字列としてセットされているので、このデータ属性 method からメソッドを判断し、そのメソッドに応じた機能が実行されるように views.py の関数で条件分岐を実装してやれば良いことになります。

メソッドに応じた処理・機能の切り替え
def index(request):
    if request.method == 'GET':
        # GETに対応する機能の処理を実装

    elif request.method == 'POST':
        # POSTに対応する機能の処理を実装

    # ~略~

このような、views.py の関数での “メソッドによる条件分岐” と、urls.py での “URL と関数とのマッピング” により、リクエストのメソッドと URL に応じた機能の実行が実現できることになります。

URLとメソッドに応じた機能が実行される様子

ただし、views.py に定義する全ての関数で method に応じた条件分岐が必要になるというわけではないです。特定のメソッドしか受け付けないような URL の場合は、データ属性 method に応じた条件分岐は行わず、受け付けるメソッドに対する1つの機能のみを関数内に実装することもあります。 

また、メソッドに関わらず、views.py に定義する関数は必ず HttpResponse のサブクラスのインスタンスを返却する必要がありますので、この点には注意してください。

views.py からの Model と Template の利用

少し話を戻して、前述で一番簡単な views.py の関数の例を示しました。この関数では、必ず Hello World をボディとするレスポンスが返却されることになります。

views.pyの一番簡単な例
from django.http.response import HttpResponse

def index(request):
    return HttpResponse('Hello World')

ただ、このような機能だと何の面白みもないウェブアプリとなってしまいます。上記の例の場合は真っ白な画面に  Hello World と表示されるだけ…。

もっと面白みのあるウェブアプリ、価値のあるウェブアプリ、使っていて楽しくなるようなウェブアプリを開発していくためには、そのような特色を出せるような機能を検討し、それを実装していく必要があります。そして、この機能は views.py に実装していくことになります。

ただ、機能の全てを views.py に実装していくと views.py が複雑になってメンテナンスが大変になってしまいます。なので、下記ページでも解説しているように、Django では、View (views.py) は MTV における Model と Template を利用して開発することになります。この Model の役割を担うのが models.py で、Template の役割を担うのが templates フォルダ以下 のファイルとなります。

【Django入門1】Djangoとは?

Model を利用することで、データベースを利用してデータを保存したり、データベースからデータを取得することができるようになります。例えば、この Model を利用してユーザーをデータベースで管理すればログイン機能などを実現することができますし、ユーザーとツイートを管理すれば Twitter のようなウェブアプリも実現できます。

また、Template を利用することで、データベースで管理するデータの表示を効率的に実現することができるようになりますし、この Template でウェブアプリの画面(ページ)を美しく・きれいに・可愛く・かっこよく仕立てることもできます。

views.pyで定義する関数からModelやTemplateを利用する様子

ここからは、これらの models.pytemplates のフォルダ以下 についての説明をしていきたいと思います。

models.py

ということで、次は models.py について解説していきます。

models.py の役割

models.py は、Django における MTV の Model の実装先となるファイルとなります。Model はデータベースの管理・操作を行うことを役割としており、この Model を View (views.py) から利用することで、ウェブアプリのデータの保存機能や、保存したデータの取得機能を実現することが出来ます。

models.pyの役割を示す図

例えば、ウェブアプリではユーザー登録やログインが必要なものが多いです。これらの機能に関してもデータベースを利用して実現されることが多いです。ユーザーの登録はデータベースへのユーザーの情報(ユーザー名とパスワードを含む)の保存によって実現できますし、ログインに関しては、ユーザーが入力したユーザー名とパスワードを、データベースに保存されたユーザー名とパスワードと照合することで実現できます。

他にも、掲示板への投稿に関してはデータベースへのコメントの保存、掲示板の表示に関してはデータベースからのコメントの取得によって実現できます。ゲームであれば、対戦成績をデータベースに保存して、後からランキング化するようなこともできます。

掲示板アプリがデータベース操作によって実現されることを示す図

こんな感じで、ウェブアプリではデータベースを活用することで様々な機能を実現することが可能です。MTV モデルにおいて、機能を実現するのは View になりますが、機能を実現する上で必要なデータベースの操作は Model で実現し、その Model を View から利用することで、データベースを利用する機能を実現していくことになります。

基本的には、ウェブアプリで何らかのデータを保存する際は必ずデータベースを利用すると考えて良いと思います。なので、データの保存を行うウェブアプリを実現するときには Model、つまり models.py の実装が必要となります。

models.py の作り方

続いて models.py の作り方について解説していきます。

models.py には、データベースの操作を行うクラスの定義を行う必要があります。そして、そのクラスを View (views.py) に利用してもらい、View からデータベース操作・管理が行えるようにします。

データベースの操作を行うクラスと聞くと難しそうに感じますが、実は、このようなクラスは超簡単に実現することができます。Django フレームワークには Model というクラスが存在し、この Model クラスにはデータベースの操作を行うメソッドが定義されています。なので、この Model というクラスを継承するサブクラスを定義してやれば、データベースの操作を行うクラスが定義できることになります。

models.pyに定義するクラスの説明図

例えば下記の Person クラスは Model を継承しているため、データベース操作が可能なクラスとなります。

Modelの継承
from django.db import models

class Person(models.Model):
    pass

なんですが、Model には “管理するデータ” が定義されていません。なので、上記のように単に Model を継承しても、データベースの操作を行うメソッドは利用できるものの、データベースで何もデータが管理できないことになります。

そのため、単に Model を継承するだけでなく、クラス変数としてデータベースで管理するデータを定義する必要があります。このデータベースで管理するデータの定義も含めた Person クラスの定義例は下記となります。このクラスを利用すれば、クラス変数の名称となる usernameageheightweight のデータを管理するデータベースが操作可能となります。

models.pyでのModelのサブクラスの定義例
from django.db import models

class Person(models.Model):
    username = models.CharField(max_length=20)
    age = models.IntegerField()
    height = models.FloatField()
    weight = models.FloatField()

また、クラス変数の定義における右辺は、そのデータの型を表します。例えば username = models.CharField(max_length=20) は、username の型が文字列(最大 20 文字)であることを示しています。その他のデータは整数型であることを示しています。

このように、models.py では、Model を継承するクラスを定義し、さらにデータベースで扱うデータをクラス変数として定義することが最低限必要となります。

Model のサブクラスとデータベースとの関係性

models.py の作り方の基本については理解していただけたのではないかと思います。

では、この models.pyModel のサブクラス を定義することにはどんな意味があるのでしょうか?この点について解説していきます。

結論としては、Model のサブクラス はデータベースにおけるテーブルであり、この Model のサブクラス を定義しておくことで、Model のサブクラス に対応したテーブルをウェブアプリ内で扱うことが出来るようになります。また、Model のサブクラス のインスタンスは、そのテーブルのレコードとして扱われます。

テーブルとModelのサブクラス、レコードとMoldeのサブクラスのインスタンスとの関係性を示す図

データベースでデータを管理するとは、具体的にはデータベース内に存在するテーブルにレコードを保存したり、テーブルからレコードを取得したり、テーブルのレコードを更新したりする操作のことを言います。つまり、データベースでデータを管理するとは、テーブルに対して操作・処理を行うことを言います。したがって、データベースでデータを管理するためにはテーブルが必要となります。

さらに、このテーブルには、テーブル特有の列が存在します。この列のことをカラムやフィールドと呼びます(Django でウェブアプリを開発する場合はフィールドと覚えた方が分かりやすいと思います)。そして、このテーブルのフィールドによってテーブルで扱うことのできるデータが決まることになります。つまり、テーブルでデータを扱うためには、テーブルの持つフィールドを定義しておく必要があります。

で、この “テーブルの持つフィールド” の定義は、ソースコード的には Model のサブクラス を定義することで実現することになります。

ここで再度、先ほど示した Model のサブクラス の定義例を確認してみましょう!

models.pyでのModelのサブクラスの定義例
from django.db import models

class Person(models.Model):
    username = models.CharField(max_length=20)
    age = models.IntegerField()
    height = models.FloatField()
    weight = models.FloatField()

この Model のサブクラス では、右辺の値を models.XxxxField() としたクラス変数を定義しています。このような、値が models.XxxxField() であるクラス変数がテーブルにおけるフィールドとなります。クラス変数名がフィールド名(列名)であり、クラス変数の値、すなわち右辺がフィールドで扱うデータの型となります。

で、上記のように Model のサブクラス を定義しておくと、ウェブアプリで下の図のようなテーブルを扱うことができるようになります。このテーブルは、id のように自動的に追加されるフィールドもあるのですが、Model のサブクラス のクラス変数と同じフィールドを持つことになります。

Modelのサブクラスのクラス変数とテーブルのフィールドの関係性を示す図

また、この Model のサブクラス のインスタンスはレコードとして扱われます。レコードとは、テーブルの一行分のデータになります。つまり、レコードはテーブルと同じフィールドを持つことになり、これは、Model のサブクラス のインスタンスが、Model のサブクラス のクラス変数と同じ名前のデータ属性を持つことを意味します。

Modelのサブクラスのインスタンスとテーブルのレコードの関係性を示す図

そして、このインスタンスにメソッドを実行させることで、そのインスタンスに対応するレコードをテーブルに保存したり、テーブルから削除したりすることができます。さらに、テーブルからレコードを取得することもでき、この取得したレコードは Model のサブクラス のインスタンスとして扱うことが出来ます。

これらの Model のサブクラス のインスタンスの生成・取得、さらにはインスタンスからのメソッドの実行は View、つまり views.py で定義される関数から実行されることになります。

例えば、上記の Person クラスのインスタンス生成し、このインスタンスのデータ属性に適当な値をセットして save メソッドを実行させれば、そのインスタンスが Person クラスのテーブルにレコードとして保存されることになります。

クラスとテーブル、インスタンスとレコードの関係図を示す図

こんな感じで、ウェブアプリで扱うデータベースのテーブルのフィールドは models.pyModel のサブクラス のクラス変数によって決まること、さらに Model のサブクラス のインスタンスはテーブルのレコードであり、このインスタンスにメソッドを実行させることでテーブルへの操作が実現できることは覚えておきましょう!

また、テーブルそのものに対する操作はマネージャーと呼ばれるものを使用して実行することになります。例えばテーブルからレコードを検索するような操作にはマネージャーを利用します。このあたりも含めた Model の詳細に関しては、別途下記ページで解説を行います。

モデルの解説ページアイキャッチ 【Django入門6】モデルの基本

ただ、Model のサブクラス を定義するだけだとテーブルは作成されません。そして、テーブルが作成されていないのにテーブルに対してレコードの操作を行おうとすると例外が発生することになります。ということで、Model のサブクラス を行った後はテーブルの作成を行う必要があります。このテーブルの作成はマイグレーションによって実現可能で、マイグレーションは manage.py を利用して実行することが可能です。これに関しては、後述の Django のプロジェクトの作り方・ウェブアプリの動かし方 の節で説明していきます。 

templates フォルダ以下

続いて templates フォルダ以下 のファイルについて解説していきます。

templates フォルダ以下 の役割

この templates フォルダ以下 のファイルは、MTV モデルにおける Template の役割を果たすファイルであり、Template は、HTML の雛形となるテンプレートファイルを提供します。提供先は View になります。

templatesフォルダ以下のファイルの役割を示す図

ウェブアプリとは で説明したように、ウェブアプリはリクエスト受け取ったら機能を実行し、その機能から得られた結果に応じたレスポンスを返却する必要があります。基本的には、レスポンスのボディは HTML であると考えて良いです。そして、ウェブブラウザは HTML を受け取り、その HTML に基づいてページを描画することになります。

ウェブアプリからHTMLがレスポンスとして返却される様子

このような HTML を生成するために、View は Template のテンプレートファイルを利用することになります。そして、このテンプレートファイルを提供するのが Template、すなわち templates フォルダ以下 となります。

テンプレートファイルとは

このテンプレートファイルは、動的に HTML を生成するためのファイルとなります。基本的な構造は HTML と同じなのですが、変数やループ等の簡単なプログラムを扱うことが可能という点が HTML と異なります。例えば、テンプレートファイルで変数を扱うことで、その変数部分を動的に変化させて HTML を生成したり、ループを組んで同じ構造の箇所を動的に複数生成して HTML を生成したりすることが可能です。まずは、このページでは変数のみに注目して説明していきたいと思います。

ウェブアプリのページは、ページの種類が同じであれば、ページの構造自体は同じであることが多いです。ただし、構造は同じでも表示されるデータはリクエストによって異なることになります。つまり、ウェブアプリのページは、ページの雛形に対し、リクエストに応じて異なるデータを動的に埋め込むことで作成することができることが多いです。

例えば、SNS 等のウェブアプリでユーザーのプロフィールを表示するようなページを考えると、これらのページのデータ(ユーザー名や年齢など)はユーザーごとに異なるかもしれませんが、ページとしての構造(雛形)は同じです。

データの値は異なるもののページの構造自体は同じ雛形であることを示す図

なので、雛形に対し、表示するユーザーの情報を埋め込んでやれば、表示対象のユーザーに応じて異なるプロフィールページを表示することが可能となります。

テンプレートファイルの一部を変数化し、そこにユーザーに応じた値を埋め込むことでユーザーに応じたページ表示が実現できることを示した図

こんな感じで、ページの雛形のみを予め用意しておき、さらに雛形以外の部分を変数化しておけば、その雛形への変数の埋め込みのみを行うことで、様々なページの表示が可能となります。実際には、ページは HTML から描画されるので、HTML として雛形を用意しておくことになります。そして、この雛形となる HTML がテンプレートファイルとなります。このテンプレートファイルの作り方については後述で解説します。

このテンプレートファイルを提供することを役割とするのが Template となります。通常ウェブアプリは複数の種類のページを表示できるようになっているため、Template は複数のテンプレートファイルを提供することになります。そして、このテンプレートファイルの提供先は View となります。

つまり、Template は必要なテンプレートファイルを提供するだけで、View が適切なテンプレートファイルを選択し、そのファイルにデータを埋め込んで HTML を生成し、さらにそれをレスポンスとして Django フレームワークに返却する必要があります。

ViewとTemplateの関係性を示す図

データベースのデータに基づいて HTML を生成

このテンプレートファイルから HTML を生成するにあたってポイントになるのが「テンプレートファイルに埋め込むデータ」になります。

ここまでの解説を読んでくださった方なら既に予想できているかもしれませんが、このテンプレートファイルに埋め込むデータは「データベースで管理されているデータ」であることが多いです。

ウェブアプリとは で説明したように、ウェブアプリは「リクエスト受け取ったら機能を実行し、その機能から得られた結果に応じたレスポンスを返却するアプリ」です。そして、この機能はデータベース操作であることが多く、その場合はデータベースの操作結果に応じたレスポンス (HTML) を返却することになります。

例えば、xxx さんのプロフィールページを表示するのであれば、xxx さんの情報を予めデータベースで管理するようにしておき、xxx さんのプロフィールページを表示したいというリクエストを受け取ったときに、xxx さんの情報をデータベースから取得し、それをテンプレートファイルに埋め込んで HTML を生成する感じですね。

データベースの操作自体は Model が行うことになりますが、その Model を利用するのは View になります。また、テンプレートファイルへのデータの埋め込みを行うのも View になります。なので、View、すなわち views.py の関数は下記のような処理を実行する必要があることになります。

  • ①:Model を利用してデータベースの操作を行う
  • ②:Template から提供されるテンプレートファイルを選択する
  • ③:①の結果を②のテンプレートファイルに埋め込んで HTML を生成する
  • ④:HTML をボディとするレスポンスを返却する

ただし、③と④に関しては、Django フレームワークから提供される render 関数を実行することで実現できます。①と②の結果を引数に指定して render 関数を実行すれば、テンプレートファイルからの HTML の生成が行われ、それをボディとする HttpResponse のインスタンスを返却値として取得することができます。

なので、基本的には View は①と②を行なった後に render 関数を実行し、その結果を Django フレームワークに返却すれば良いだけになります。

views.pyがHttpResponseのインスタンスを生成するまでの流れ

この処理の流れは、views.py で定義する関数の処理の流れの基本となりますので、是非覚えておきましょう!

テンプレートファイルの作り方

次にテンプレートファイルの作り方について説明していきます。

テンプレートファイルの拡張子は .html であり、アプリのフォルダに templates フォルダを、さらに templates フォルダの下に アプリ名 のフォルダを作成し、そのフォルダの下にテンプレートファイルを設置することになります。

このテンプレートファイルは、基本的には HTML と同様の構造のファイルとなります。ただし、単なる HTML は静的なファイルであり、動的に変化させることができません。動的に変化させるためには、Django のテンプレートファイルならではの記述が必要となります。これを Django テンプレート言語と呼びます。

例えば、変数を埋め込み可能なテンプレートファイルを作成する場合、その変数を埋め込み可能にしたい部分を {{変数名}} と記述する必要があります。そして、テンプレートファイルから HTML を生成する際に、後述で説明するコンテキストというデータによって {{変数名}} 部分に埋め込むデータを指定すれば、そのデータが  {{変数名}} の部分に埋め込まれた HTML が生成されることになります。なので、コンテキストのデータを動的に変化させることで、1つのテンプレートファイルから無数の HTML が生成できることが可能です。

例えば、下記のようなテンプレートファイルの場合、{{username}}{{age}}{{height}}{{weight}} の部分は変数として扱われることになります。

テンプレートファイルの例
<!DOCTYPE html>
<html lang="'ja">
    <head>
        <meta charset="utf-8">
        <title>プロフィール</title>
    </head>
    <body>
        <h1>プロフィール</h1>
        <div>
            <h2>{{username}}の情報</h2>
            <p>年齢:{{age}}</p>
            <p>身長:{{height}}</p>
            <p>体重:{{weight}}</p>
        </div>
    </body>
</html>

変数以外にも条件分岐やループを行うような命令や、さらに埋め込むデータを加工するようなフィルター処理をテンプレートファイルに実装することもできます。

このあたりの詳細に関しては、下記の Template の解説ページで別途説明を行いたいと思います。

Djangoのテンプレートの解説ページアイキャッチ 【Django入門4】テンプレート(Template)の基本

テンプレートファイルからの HTML の生成

ついでに、前述で少し触れた render 関数についても説明しておきます。render 関数は、前述のとおり、テンプレートファイルへのデータの埋め込みを実行して HTML を生成する関数となります。そして、render 関数は、その HTML をボディとするレスポンスとなる HttpResponse のインスタンスを返却します。

render 関数は HttpResponse のインスタンスを返却しますので、View (views.py に定義する関数) は render 関数の返却値をそのまま返却してやれば良いことになります。これで、View の関数を作成するときのルールの1つである「返却値でレスポンスを返却すること」を自然と満たすことが出来ます。

また、View は、render 関数を実行する前に、リクエストに応じた機能の実行(データベースの操作)及びテンプレートファイルの選択を行う必要があります。そして、render 関数を実行する時に、選択したテンプレートファイル(のパス)とテンプレートファイルに埋め込みたい “コンテキスト” を引数に指定する必要があります。このコンテキストは、言ってしまえば辞書で、このコンテキストの各要素に '変数名': データ を持たせることで、{{変数名}} 部分に埋め込むデータを指定することが出来ます。

render関数の説明図

なので、コンテキストを機能の実行結果(データベースの操作結果)に応じて作成するようにしてやれば、生成される HTML は “機能から得られた結果に応じた HTML” となり、ウェブアプリに必要となる “機能から得られた結果に応じたレスポンスを返却する” を満たすことができるようになります。

views.py に定義する関数として、典型的な処理の流れの例として実装した関数が下記となります。

render関数の利用例
from django.shortcuts import render
from .models import Person

def index(request, person_id):
    person = Person.objects.get(id=person_id)
    
    context = {
        'username' : person.username,
        'age' : person.age,
        'height' : person.height,
        'weight' : person.weight,
    }

    return render(request, 'testapp/index.html', context)

この関数では、まず引数で指定された person_id の値を id フィールドに持つレコードをデータベースから取得しています。Person.objects.get(id=person_id) が、models.py の節で少しだけ触れたマネージャーによるテーブルの操作となります。このようにテーブルから特定のレコードを検索して取得するような処理に関してはマネージャーを利用することになります。

次に、そのレコード personusernameageheightweight フィールドの値に基づいてコンテキスト context を生成しています。最後に、render 関数を実行し、第2引数に指定したパスのテンプレートファイルに対して context の各要素で指定されたデータをテンプレートの変数部分に埋め込んで HTML を生成しています。そして、その HTML をボディとする HttpResponse のインスタンスを返却しています。

render 関数では、context の各キーの値が、前述で紹介したテンプレートファイルにおける {{変数名}} の部分に埋め込まれることになります。具体的には、{{username}} の部分に person.username の値が、{{age}} の部分に person.age の値が埋め込まれるといった感じですね。

person はデータベースから取得されたレコードですので、データベースから取得したデータに応じて生成される HTML が動的に変化することになります。さらに、クライアントからのリクエストに応じて取得するレコードを変化させれば、クライアントのリクエストによって HTML が変化することになります。

こんな感じで、リクエストに応じたレスポンスを返却することを実現するためのファイルがテンプレートファイルとなります。

送信フォームの設置

また、ウェブアプリでは、クライアントからのデータの送信を実現するために、下の図のようなフォームをページに設置することが多いです。こういったフォームでデータを送信することで、例えばユーザー登録を行なったり、コメントを投稿したりすることができます。

フォームの説明図

こういったフォームに関しては、表示するフォームの定義を アプリフォルダ 内の forms.py で行い、それをテンプレートファイルに埋め込むことで表示することができます。

この辺りのフォームに関する解説に関しては下記ページで解説していますので、詳細に関しては下記ページをご参照ください。

Djangoのフォームの解説ページアイキャッチ 【Django入門5】フォームの基本

スポンサーリンク

Django のプロジェクトの作り方・ウェブアプリの動かし方

次は、Django のプロジェクトの構成 で示したプロジェクトの作り方と、ウェブアプリの動かし方について解説していきます。

プロジェクトを作成する

まずはプロジェクト自体の作り方について解説していきます。

プロジェクトは、django-admin というプログラムを利用して作成することになります。この django-admin は Django インストール時に一緒にインストールされるプログラムになります。

プロジェクトを作成するときは、下記のように startproject と プロジェクト名 を引数に指定して django-admin を実行します。コマンドは、コマンドプロンプトや PowerShell やターミナル等のコマンドが実行可能なアプリから実行してください。

% django-admin startproject プロジェクト名

これにより、コマンドを実行した位置のフォルダ直下に プロジェクト名 のフォルダが生成されます。このフォルダの中の構成は下の図のようになっているはずです(図では __init__.py は省略しています)。

startprojectコマンドで生成されるファイル

上の図のように、この プロジェクト名 のフォルダの中には manage.py と、もう1つの プロジェクト名 のフォルダが生成されることになります。つまり、プロジェクト名 のフォルダの中に プロジェクト名 のフォルダが存在することになります。以降では、この内側に存在する プロジェクト名 のフォルダのことを プロジェクト設定フォルダ と呼ばせていただきます。

アプリを作成する

続いてアプリを作成していきます。

まず、アプリフォルダ を作成し、続いて アプリフォルダ 内のファイルを変更していくことになります。

アプリフォルダ を作成する

アプリフォルダmanage.py を利用して自動生成することができます。manage.py に関しては、先ほど実行しした django-admin startproject によって自動的に生成されます。

具体的には、アプリフォルダ は下記のように startappアプリ名 を引数に指定して manage.py を実行することで自動的に生成することが出来ます。このコマンドは、先ほど自動生成された プロジェクト名 のフォルダ内で実行する必要があります。

% python manage.py startapp アプリ名

これにより、プロジェクト名 のフォルダの下に、すなわち プロジェクト設定フォルダ と同階層に アプリ名 のフォルダが生成されるはずです。この アプリ 名のフォルダが アプリフォルダ となります。

startprojectコマンドとstartappコマンドで生成されるファイル

ここまで説明してきた views.pymodels.pyアプリフォルダ の中に自動生成されていることも確認できると思います。ただ、urls.pyforms.py、さらには templates フォルダ は自動生成されません。これらのファイルやフォルダも、結局ウェブアプリを開発するときに必要になることが多いので手動で追加しておくことをお勧めします。また、 templates フォルダ の下には アプリ名 のフォルダも必要となりますので、このフォルダも忘れずに作成しておきましょう。

手動で必要になるファイルを追加すれば、プロジェクト名 フォルダ以下の構成は下の図のようになるはずです(図では __init__.py は省略しています)。

必要になるファイルを手動で追加した後のプロジェクトの構成

アプリを開発する

必要なフォルダ・ファイルが用意できれば、次は実際にアプリを開発していくことになります。具体的には アプリフォルダ 内の特に下記を編集してアプリを開発していくことになります。必要に応じて forms.py の編集も必要となります。

  • views.py
  • models.py
  • templates フォルダ以下
  • urls.py

これらのファイルの役割や作り方については既に Django のプロジェクトの構成 で説明しましたし、今後個別の解説ページで詳細を解説していきますので、ここでの詳細な解説は省略させていただきます。

スポンサーリンク

プロジェクトの設定を行う

続いて、プロジェクトの設定を行っていきます。

アプリの登録

プロジェクトの設定は、主に、プロジェクトフォルダに存在する settings.py で行うことになります。

settings.py では、Django フレームワークおよび、プロジェクト内のアプリの共通の設定を行うことができます。様々な設定が可能で、例えば使用するデータベース管理システムを変更するようなことも可能です。

settings.py で設定可能な項目の調べ方は下記ページで解説していますので、詳しく知りたい方は下記ページをご参照ください。

Djangoのsettings.pyで設定可能な項目とデフォルト値の調べ方の解説ページアイキャッチ 【Django】settings.py での設定可能項目やデフォルト値の調べ方

で、Django でウェブアプリを開発する際、settings.py で必ず行う必要のある設定が「アプリの登録」になります。Django フレームワークの機能は アプリフォルダ のファイルから利用することもできますが、逆に アプリフォルダ のファイルや関数は Django フレームワークから利用されるものでもあります。

例えばですが、アプリフォルダmodels.py は起動時に Django フレームワークから読み込まれることによって、他のファイルから models.py で定義されたモデルを利用できるようになります。

ただ、このような Django フレームワークからの アプリフォルダ の利用が実現できるのは、Django フレームワークがそのアプリを認識しているからであって、アプリを認識していなければ アプリフォルダ のファイルを利用することはできません。

そのため、アプリの存在を Django フレームワークに認識させる必要があります。このために行うのが settings.py でのアプリの登録になります。このアプリの登録は、settings.pyINSTALLED_APPS というリストの要素に アプリ名 を追加する必要があります(もしくは アプリフォルダapps.py で定義されるクラスを指定するのでも良いです)。

例えば下記は、'testapp' という名前のアプリを登録する例となります(1行目に追記しています)。

settings.pyでのINSTALLED_APPSの設定
INSTALLED_APPS = [
    'testapp', # 'testapp.apps.testapp'でも可
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

これによって Django フレームワークが登録されたアプリを認識し、そのアプリに対する アプリフォルダ 以下のファイルが Django フレームワークから利用されるようになります。上記では1つのアプリのみを登録していますが、複数のアプリを登録することも可能です。

また、実際に settings.py を確認してみると分かると思いますが、自動生成された時点で settings.pyINSTALLED_APPS にはデフォルトで複数のアプリが登録されていることになります。

例えば django.contrib.admin は Django フレームワークにおける管理画面機能を実現するアプリであり、これがINSTALLED_APPS に登録されているため、管理画面を自身で開発しなくても管理画面の機能を利用することができるようになっています。また、django.contrib.auth は Django フレームワークにおける認証機能を実現するアプリとなり、認証機能を自身で開発しなくても認証機能を利用することができるようになっています。

こういったデフォルトで登録が行われているアプリも存在することや、こういったアプリと連携動作して自身が開発するアプリが動作し、それによって1つのウェブアプリが実現されていくということも覚えておくと良いと思います。

プロジェクト/urls.py の設定

もう1つ重要になる設定が、アプリフォルダurls.py の読み込みの設定になります。

これに関しては プロジェクトとアプリの urls.py で詳細を説明したので、ここでの説明は省略しますが、Django フレームワークから アプリフォルダurls.py が読み込まれるように、プロジェクト設定フォルダurls.py を作成する必要があります。

テーブルの作成

次は、データベースへのテーブルの作成を行います。

models.py の節でも説明したように、models.py に定義する Model のサブクラスがデータベースのテーブルとして扱われることになります。ですが、このテーブルは Model のサブクラスを定義するだけでは自動的に作成されません。このクラスを定義した上で、マイグレーションを実行することでデータベースにテーブルが作成されることになります。

そのマイグレーションは、下記の2つのコマンドを実行することになります。ここでも manage.py を利用することになります。

% python manage.py makemigrations
% python manage.py migrate

makemigrations コマンドで設定ファイルを作成する

1つ目の makemigrations コマンドは、models.py に定義されたクラスに基づいて「マイグレーションの設定ファイルを作成する」ためのコマンドになります。

つまり、このコマンドではデータベースにテーブルは作成されません。あくまでも models.py に定義されたクラスに基づいた設定ファイルを作成するのみです。ですが、2つ目の migrate コマンドでは、このファイルに基づいてテーブルの作成が行われることになるため、migrate コマンドを実行する前に makemigrations コマンドを実行しておく必要があります。

また、この makemigrations コマンドで作成される設定ファイルは アプリフォルダmigrations フォルダの下に作成されます。最初に makemigrations コマンドを実行した際には 0001_initial.py が作成され、その中に models.py に定義されたクラスの情報が記述されています。

makemigrationsコマンドの意味合いを説明する図

migrate コマンドでテーブルを作成する

さらに、2つ目の migrate コマンドでは、makemigrations コマンドによって生成された設定ファイルに基づいてデータベースへのテーブルの作成が行われることになります(既にテーブルが存在する場合はテーブルの更新が行われます)。

migrateコマンドの意味合いを説明する図

ウェブアプリを初めて開発する場合、データベース上にテーブルが存在しない状態となっている可能性が高いです。そのため、ウェブアプリでデータベースへのレコードの保存等を行いたいのであれば、まずは上記のような操作を行なってテーブルを作成しておく必要があります。

マイグレーションの実行タイミング

また、上記の操作によってデータベースに作成されるテーブルは、makemigrations コマンドを実行したタイミングにおける models.py に基づいたものになります。そのため、models.py を変更した場合は(特にクラスにクラス変数を追加・削除・変更した場合)、上記の2つのコマンドを再度実行してテーブルを更新する必要があるので注意してください。

2回目以降に makemigrations コマンドを実行した場合、前回 makemigrations コマンドを実行した時からの models.py の差分に基づいた設定ファイルが migrations フォルダに作成されることになります。そして、その後に migrate コマンドを実行することで、新たに作成された migrations フォルダの設定ファイルも含めてデータベースのテーブルの作成や更新が行われることになります。

データベース自体の作成も必要

ちなみに、上記ではデータベースのテーブルの作成について説明しましたが、テーブルを作成する前にデータベース自体の作成も必要となるので注意してください。

ただ、Django では、デフォルト設定では SQLite3 というデータベース管理システムが使用されるようになっており、この管理システムを利用する場合は、先ほど説明したマイグレーションを実行することでデータベース自体の作成も行われるようになっています。なので、デフォルト設定のまま SQLite3 を利用するのであれば、データベースの作成に関しては気にする必要は特にないです。

ただ、他のデータベース管理システムを利用する場合は別途データベース自体の作成も必要になることがあるので注意してください。Django 初心者の方であれば、まずは SQLite3 を利用してウェブアプリを開発することになると思うので、まずはデータベースの作成については気にする必要はありません。ですが、他のデータベース管理システムを利用する場合はデータベースの作成が別途必要となることが多いので、この点には注意してください。

ウェブアプリを動作させる

ここまでの設定を行えば、ウェブアプリを動作させる準備が整ったことになります。

準備が整ったら、後はウェブアプリを実際に動作させて動作確認を行いましょう!

開発用ウェブサーバーを起動する

Django の全体像 でも解説したように、ウェブアプリはウェブアプリ単体で動作するのではなく、ウェブサーバー等の他のソフトウェアと連携して動作することになります。ただ、これらのソフトウェアを用意するのは面倒なので、動作確認やテスト時には 開発用サーバーでのウェブアプリの動作確認 で紹介した開発用ウェブサーバーを利用してウェブアプリを動作させることになります。

開発用ウェブサーバーを利用したウェブアプリの動作環境

そして、この開発用ウェブサーバーに関しても Django の場合は manage.py を利用することで起動することが可能です。

具体的には、下記のコマンドを実行することで開発用ウェブサーバーが起動します。

python manage.py runserver

これにより、開発用ウェブサーバーが起動し、クライアントからのリクエストを待ち続けている状態になります。そして、リクエストを受信した際には、Django フレームワークがリクエストを受け取り、さらにプロジェクト内のファイルの読み込みや関数の実行が行われることになり、これによってウェブアプリが動作することになります。

どれだけ頑張ってウェブアプリを開発したとしても、この開発用ウェブサーバーを起動しないとウェブアプリは動作すらしないので注意してください。

1つ補足しておくと、デフォルト設定では、開発用ウェブサーバーはポート番号 8000 でリクエストを待つようになっています。異なるポート番号でリクエストを待ちたい場合は、下記のように runserver の引数にポート番号を指定するようにしてください。

python manage.py runserver 80

スポンサーリンク

リクエストを送信する

開発用ウェブサーバーを起動したら、次はリクエストを送信して実際にウェブアプリの動作確認を行うことになります。

このリクエストはウェブブラウザから送信可能で、ウェブブラウザのアドレスバーにウェブアプリが受け付けるリクエスト、すなわち各種 urls.py で定義した URL を指定してやれば、その URL に対するリクエストが開発用ウェブサーバーに送信されることになります。

リクエストの送信方法の説明図

ただし、URL は絶対パスで指定する必要があるので注意してください。開発用ウェブサーバーを起動した PC と同じウェブブラウザで動作確認を行うのであれば、下記のような形式の URL をウェブブラウザのアドレスバーに指定する必要があります。

http://127.0.0.1:8000/xxxx/yyyy/

また、 ウェブアプリが受け付け可能な URL をリンク先に設定したリンクテキストをページに表示するようにしておけば、それをクリックすることでもウェブアプリに対してリクエストを送信することができるようになります。

リンクのクリックでもリクエストが送信可能であることを説明する図

さらに、リクエストの送信に関しては、下記ページで紹介している requests モジュールを利用すれば Python スクリプトから実施することができます。

requestsモジュールの解説ページアイキャッチ 【Python】reqeustsモジュールについて解説

requestsモジュールでのウェブアプリの操作の仕方の解説ページアイキャッチ 【Python】requestsモジュールでPOSTメソッドのリクエストを送信(ウェブアプリの操作)

このように、様々なリクエストの送信方法があるのですが、まずはアドレスバーに直接 URL を指定するのが無難だと思います。

レスポンスを確認する

リクエストを送信すれば、開発用ウェブサーバーがリクエストを受信し、そのリクエストをウェブアプリが受け取ることになります。具体的には、urls.py でリクエストの URL にマッピングされた views.py の関数が実行されることになります。そして、views.py の関数の返却値に基づいたレスポンスを、開発用ウェブサーバーを経由してウェブブラウザが受信することになります。

これによって、送信されたリクエストの URL に基づいたページがウェブブラウザに表示されますので、この表示結果からレスポンスの内容を確認することができます。意図した通りのページが表示されているかどうかをチェックしてみましょう!

レスポンスの確認方法の説明図

こんな感じで、基本的にはウェブブラウザでリクエストの送信とレスポンスの確認を行うことで、ウェブアプリの動作確認を行うことになります。

Django のウェブアプリ内部の動作の流れ

ここまでプロジェクト内のファイルの構成や各ファイルの役割、さらにプロジェクトの作り方について解説してきました。

最後に、Django で開発したウェブアプリ内部の動作の流れについて、特にプロジェクト部分に注目しながら説明しておきたいと思います。

ここでは 開発用ウェブサーバーでのウェブアプリの動作確認 で紹介した開発用ウェブサーバーを利用する場合の動作について解説していきます。ウェブサーバーや AP サーバーを利用した場合は多少動作が異なるので注意してください。

開発用ウェブサーバーを利用したウェブアプリの動作環境

スポンサーリンク

settings.py の読み込み

Django 開発用ウェブサーバーを利用する場合、Django 開発用ウェブサーバーを起動した際にウェブアプリのセットアップが行われることになります。

最初に行われるのは settings.py の読み込みになります(読み込みとは、具体的には import のことを言っています)。

アプリの登録 で少し説明しましたが、settings.py はウェブアプリにおける Django フレームワーク部分の動作の設定を行うものであり、この読み込みが行われることで、settings.py での設定に基づいて Django フレームワークが動作するようになります。

また、ウェブアプリを動作させるという点でポイントになるのが、アプリの登録  での INSTALLED_APPS の設定になります。この設定により Django フレームワークがプロジェクト内の アプリフォルダ の存在を認識し、settings.py の読み込みによって、INSTALLED_APPS に指定されたアプリのセットアップが行われます。

settings.pyの読み込みによりDjangoフレームワークの動作の設定が行なわれ、さらにDjangoフレームワークがインストールされているアプリを認識する

アプリのセットアップ

続いて、このアプリのセットアップの流れを説明していきます。

ここでは、アプリフォルダ のファイルの読み込みによってアプリのセットアップが行われていくことになります(詳しくは説明しませんが、下記のセットアップは settings.pyINSTALLED_APPS に指定されている全アプリに対して行われるものになります)。

apps.py の読み込み

アプリのセットアップにおいて、まず行われるのが アプリフォルダ の  apps.py の読み込みになります。このページでは apps.py についての詳細は説明しませんでしたが、この apps.py はアプリの設定(名前など)を行うファイルになります。このファイルを変更することで、そのアプリならではのセットアップなども行うことが可能となります。が、まずは Django 入門者の方は apps.py は自動生成された状態のものをそのまま利用すればよいと思います。

この apps.py の読み込みにより、アプリに設定された情報(例えば名前など)を Django フレームワークが認識することになります。

apps.pyの読み込みによってDjangoフレームワークがアプリの設定を認識する様子

models.py の読み込み

続いて、アプリ名 フォルダの models.py の読み込みが行われます。これにより、アプリで扱う Model のサブクラスを Djangoo フレームワークが認識することになります。models.py で解説したように、この Model のサブクラスはデータベースにおけるテーブルとして扱われ、さらに、このクラスのインスタンスはテーブルのレコードとして扱われます。

models.pyの読み込みによってDjangoフレームワークがテーブルの情報を認識する様子

admin.py の読み込み

次に、アプリフォルダadmin.py の読み込みが行われることになります。これにより、ウェブアプリの管理画面のセットアップが行われます。このファイルについても詳しくは説明しませんでしたが、このファイルを編集することで、ウェブアプリの管理画面から models.py で定義した Model のサブクラスのテーブルの操作を行うようなこともできるようになります。

admin.pyの読み込みによってDjangoフレームワークの管理画面機能が管理対象のテーブルを認識する様子

この admin.py や管理画面については、下記ページで別途詳細を解説していますので、詳しくは下記ページをご参照いただければと思います。

Djangoの管理画面の使い方の解説ページアイキャッチ 【Django入門11】管理画面(admin)の使い方の基本

以上が、INSTALLED_APPS に指定されている各アプリに対して実行されるセットアップ処理になります。

これらの一連のセットアップ処理は、あくまでも settings.pyINSTALLED_APPS に指定されているアプリに対して実行されるという点に注意してください。INSTALLED_APPS に自身が開発したアプリを指定しなかった場合、当然セットアップは実施されず、アプリのセットアップの後に実行される処理で例外が発生する可能性があります。

settings.pyINSTALLED_APPS のリストにアプリを指定することで、初めて Django フレームワークが、そのアプリを認識するという点をしっかり覚えておきましょう!

urls.py の読み込み

アプリのセットアップの後は、Django フレームワークから  urls.py が読み込まれることになり、この読み込みによって、Django フレームワークがリクエストを受け取った際に、リクエストされた URL に応じて実行する関数を振り分けることができるようになります。

urls.pyの読み込みによってDjangoフレームワークが各URLに対するリクエストを受け取った際に実行する関数・メソッドを認識する様子

このときに読みこまれる urls.pyプロジェクト設定フォルダ 内のものになりますが、その urls.py の中で アプリフォルダurls.pyinclude するようにしている場合、プロジェクト設定フォルダ 内の urls.py を読み込む際に、アプリフォルダurls.py も読み込まれることになります。

また、特に アプリフォルダ の urls.py では URL と views.py とのマッピングを行うために views.py を import することが多いです。なので、この アプリフォルダ の urls.py の読み込み時には views.pyviews.py から import されているモジュールのファイルが読み込みされることになります。views.py 等に文法的な誤りなどがあると、この時点で例外が発生してウェブアプリのセットアップに失敗するので注意してください。

スポンサーリンク

wsgi.py の実行

以上でウェブアプリの、特にプロジェクトのセットアップが完了したことになります。このセットアップ終了後に行われるのが  プロジェクト設定フォルダ 内の wsgi.py の実行になります。

wsgi.py は、簡単に言うとウェブアプリの入り口と出口の役割を果たすファイルになります。違う言い方をすれば、上位のサーバーと Django フレームワークとの仲介を行うファイルです。

開発用ウェブサーバー等の、ウェブアプリの上位側のサーバーは、プロジェクトのセットアップ完了後に wsgi.py を実行して、wsgi.py で定義される “ウェブアプリの入り口となる呼び出し可能なオブジェクト” を取得します(以降、このオブジェクトをエントリーポイントと呼びます)。そして、上位のウェブサーバーがリクエストを受け取ったときには、このエントリーポイントを実行してウェブアプリを動作させることになります。

wsgi.pyの役割を示す図

このエントリーポイント実行時には引数としてリクエストが渡されることになります(環境変数として渡される)。そして、このリクエストをエントリーポイントから Django フレームワークに渡してウェブアプリの機能が実行されることになります。また、Django フレームワークから受け取ったレスポンスを上位のサーバーに返却するのもエントリーポイントの役割となります。

wsgi.pyを経由して上位のサーバーとDjangoフレームワークがリクエスト・レスポンスのやりとりを行う様子を示す図

こんな感じで、実は上位のサーバーとリクエストやレスポンスのやりとりを行うのは wsgi.py となります。最初は wsgi.py については意識せずにウェブアプリを開発すれば良いと思いますし、自動生成されたままの wsgi.py を利用するので問題ないと思いますが、wsgi.py の役割については覚えておくと良いと思います。

アプリの実行

ここまで説明してきた流れの処理が行われることで、開発用ウェブサーバーの起動・ウェブアプリ(Django フレームワークやプロジェクト)のセットアップが完了することになります。これらが完了すればウェブアプリが動作可能となり、開発用ウェブサーバーはウェブブラウザ等のクライアントからのリクエスト待ちの状態になります。

そして、クライアントからリクエストを受け取った際には、前述の通り、開発用ウェブサーバーから wsgi.py を経由して Django フレームワークにリクエストが渡されます。そして、この Django フレームワークからは urls.py の設定に基づいて views.py の関数やメソッドが実行されることになります。

さらに、views.py の関数からは、models.py で定義したクラスを利用してテーブルの操作が行われることになります。models.py では Model のサブクラス を定義することになるので、このテーブルの操作の際には Django フレームワークで定義された Model クラスが動作してテーブルの操作が行われることになります。

また、views.py の関数からは、テーブルの操作結果等を render 関数を使ってテンプレートファイルに埋め込み、その結果となる HTML をボディとした HttpResponse のインスタンスが返却されることになります。そして、こここで実行する render 関数からは引数で指定された templates フォルダ以下 に存在するテンプレートファイルが読み込まれて HTML の生成が行われることになります。

また、HttpResponse のインスタンスが views.py の関数から返却されることで、Django フレームワーク及び wsgi.py を介して開発用ウェブサーバーがレスポンスを受け取り、それがクライアントに返却されることになります。

こんな感じで、Django フレームワークとプロジェクト内のファイルが動作することでクライアントからウェブアプリが利用されることになります。特に、urls.pyviews.pymodels.pytemplates フォルダ以下 の役割や関係性については重要となりますので、Django を利用するのであれば、この辺りはしっかり頭に入れておきましょう!

まとめ

このページでは、Django の全体像と Django の動作の仕組みについて解説しました!

Django で開発するウェブアプリは、大きく分けて Django フレームワークとプロジェクトの2つから構成されます。さらにプロジェクトはプロジェクト設定と1つ or 複数のアプリから構成されます。

プロジェクト設定は主に Django フレームワークの動作を設定するものであり、アプリはウェブアプリの独自の機能や動作を実現していくためのものであると考えると、これらの関係性がわかりやすくなると思います。

最初にも説明したように、Django を利用するデメリットは「慣れるまでが大変」である点だと私は考えています。このページで解説した Django の全体像や Django のウェブアプリの動作の仕組みを覚えておくだけでも Django に慣れやすくなると思いますので、是非このページで解説したことは頭の中に入れておいてください!

ここまでは Django の全体像を理解していただくことを目的に解説を行なってきましたが、次の連載からはウェブアプリを開発するために必要となる知識としてビューやテンプレート、モデル等の具体的な解説を行なっていきます。まずは、次の連載となる下記ページでビューについて解説を行なっていますので、是非下記ページも読んでみてください!

Djangoのビューの機能についての解説ページアイキャッチ 【Django入門3】ビュー(View)の基本とURLのマッピング

同じカテゴリのページ一覧を表示