【Django入門】Djangoとは？Djangoの基本的な処理の流れ

# 前提
・Djangoとは何か？　Djangoの全体像について解説していきます。
・これからPythonでWebアプリを作ってみたい入門者、IT初学者向けの記事です。

# Djangoとは？
**Djangoは、Python用のフレームワーク**です。
フレームワークとは、
画面から画面への移動や、データの登録、メール送信、基本的なセキュリティ設定など、**よく使う機能があらかじめ用意された**ツールです。

## どうしてDjangoを使うの？
上でも述べたように、DjangoはWebアプリでよく使う機能があらかじめ用意してくれています。

Djangoを使うことで、**開発者は頻繁に使う機能を１から作る手間がなくなります**。

また、Djangoはオープンソースという**無料**で提供されているツールです。


無料で使えて手間が少なくなるのだから、PythonでWebアプリを作る際に使わない理由がありません。

# Djangoの全体像
Djangoアプリは、**１つのプロジェクト・ディレクトリ**と、**複数のアプリケーション・ディレクトリ**から構成されます。
他にも様々な設定ファイルを持っていますが、まずはこの基本的な構成を覚えておきましょう。
![Djangoの構成.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640031/74f48d15-ff92-f003-47a9-c15120a1648b.png)



TwitterなどのSNSをDjangoで作ったとしましょう。
SNSアプリ１つにつき、１プロジェクトで管理します。

SNSアプリは、
「会員登録機能」、「コメント投稿機能」、「いいね機能」などの、複数の機能を持っていますよね。
このそれぞれの機能が、各アプリケーションとなります。
（「アプリケーション１」は「会員登録機能」を管理し、「アプリケーション２」は「コメント投稿機能」を。。など）

このように、１つの機能をアプリケーションごとに管理することで、
**プログラムの変更が容易になる**というメリットがあります。

仮に全ての機能を１つのアプリケーションに詰め込んだ場合、
数週間・数ヶ月後には、「あれ。。あの機能はどのファイルの、どの辺に書いたんだっけ？」となってしまうことがあります。
そのような事態にならないためにも、機能毎に１ディレクトリ（アプリケーション）でまとめると、管理がしやすくなります。

企業などで複数人で開発を行う場合、
「Aさんは会員登録機能を作ってね」「Bさんはコメント投稿機能を」などと、
機能毎に担当者の役割を分ける際にも、この複数アプリケーションの構成は役立ちます。


１プロジェクト・複数アプリケーションの構成は、
個人で小規模なアプリケーションを作る分には、メリットを感じにくいかもしれませんが、
集団開発やコードの量が数千〜数万におよぶ大規模なシステム開発の場合、効果を実感しやすいかと思います。


# Djangoアプリの処理の流れ
Djangoで開発したWebアプリを、ユーザーがSafariやChromeなどのブラウザで操作した際の流れについて、説明したいと思います。

以下の図は、あるDjangoで開発されたWebサイトで、ユーザーが会員登録した際、システム内でどのような処理が行われるかを表しています。

自分が良く使うSNSやショッピングサイトで、会員登録した時のことを思い出しながら、処理の流れを追って見てください。

![Django Overview.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640031/3da8864c-8697-1af0-a06f-d5bd97c62013.png)




1. ユーザーがブラウザから、Webサイトの登録ページにアクセス。その後、名前やメールアドレスなど必須項目を入力し、画面上の登録ボタンを押します。この際、「会員登録よろしく！」という**リクエスト**が、システム側に飛びます。

1. 飛んできたリクエストを、**プロジェクトのルーティング**が受け取ります（ルーティングは、プロジェクトとアプリケーションの２つに分類できる）。プロジェクトのルーティングは、**リクエストの種類によって、どのアプリケーションに情報を伝えるかを判断します**。今回は、会員機能を司る「アプリケーション１」に、「会員登録のリクエストがあったよ」と情報を伝えます。

1. プロジェクトのルーティングからの情報を、**アプリケーションのルーティング**が受け取ります。今回は、会員機能の中でも会員登録を担当する「ビュー１」に情報を伝えます。

1. 「ビュー１」は**フォーム**にユーザーの会員情報を伝えます。フォームは**受け取った情報のバリデーション（正しい値が入力されているかのチェック）を行います**。

1. フォームはバリデーションの結果を「ビュー１」に返します。ここまでの処理に問題がなければ、入力データをデータベースに入れる準備が整います。

1. 「ビュー１」は**モデル**にユーザーの会員情報を伝えます。モデルは、**データベースとのやりとりを担当する**ところです。

1. モデルは「ビュー１」から受け取った情報をデータベースに「この情報を登録して！」と伝えます。

1. データベースは登録処理の結果をモデルに伝えます。

1. モデルはデータベースから受け取った情報を「ビュー１」に伝えます。

1. 「ビュー１」はモデルから受け取ったデータベースからの情報を元に、**テンプレート**が**ブラウザの画面を作成**します。

1. テンプレートは作成した画面を返します。

1. リクエストに対する<strong>返答（レスポンス）</strong>として、画面を返します。これでユーザーは会員登録が完了し、WebサービスによってはTOPページに移動したり、「登録が完了しました！」などとメッセージ画面が表示されます。


ここまで、Djangoの主な処理の流れとなります。

※処理によっては、フォームやモデルは使われないこともあります。例えばデータを登録する必要のないサービスで、単純でページ移動をする場合など。

# Djangoを構成する部品
ここで先ほど出てきた５つの<strong>部品（コンポーネント）</strong>の役割を、一つずつまとめたいと思います。

### ルーティング
ユーザーからのリクエストを、担当のビューに伝える。会員登録に関してはビュー１、コメント投稿機能に関してはビュー２、などと。
ルーティングは主にプロジェクトのルーティングと、アプリケーション毎のルーティングがある。


### ビュー
各コンポーネントの橋渡しを行う。アプリケーションの中心的な役割を果たす。

### フォーム
ユーザーが画面で入力した値をDjango内部で保持します。また、入力された値が正しいか、チェックを行います。名前や住所は全角か、文字数制限を超えていないか、メールアドレスには@が入っているか、パスワードはアルファベットと数値が含まれているか、、など。

ちなみに入力値のチェックを**バリデーション**といいます。

### モデル
データベースとのやり取りをしてくれる。
モデルを使うことで、SQL（データベースを操作する言語）を書くことなく、Pythonでデータベースの操作（データの登録、更新、削除など）が行えます。

### テンプレート
画面を作成する。
データベースから取得した情報をビューから受け取り、それを元に画面を生成したりします。
例えばAmazonのようなショッピングサイトなどで、ユーザーごとに購入履歴の画面の表示が違ってたりしますよね。
あのような画面も、データベースに登録されているデータを元に、それぞれのユーザーの画面を作ってたりします。



## まとめ
- Djangoは、Python用のフレームワーク。
- フレームワークはあらかじめよく使われる機能を用意してくれているため、オリジナルの機能に注力でき、開発の効率が上がる。
- Djangoは１つのプロジェクトと複数のアプリケーションから構成される。
- Djangoは役割毎に５つの部品に分けられる（ルーティング、ビュー、フォーム、モデル、テンプレート）

処理の流れは文章だけだと正直分かりにくいと思うので、実際に何か作ってみるのが理解しやすいと思います。

## 参照
- [動かして学ぶ！Python Django開発入門 第2版 - 翔泳社](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6-Python-Django%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-NEXT/dp/479817419X)
- [django Documentation - Writing your first Django app, part 1](https://docs.djangoproject.com/en/4.0/intro/tutorial01/)