Djangoについてゼロから勉強してみる(入門)

#Djangoとは
##PythonのWebフレームワーク
pythonにおける代表的なフレームワークは、６つあるそう。
><dl>
<dt>Django</dt>
<dd>比較的大規模な開発に向いたWebアプリケーションフレームワーク。Webアプリケーション開発で汎用的に使われる「ユーザー認証」、「管理画面」、「サイトマップ」、「RSSフィード」などの機能があらかじめ用意されており、これらについては基本的に一から開発する必要がない。**セキュリティ面においても信頼できる設計が施されており、SQLインジェクションやクロスサイトスクリプティング等の脆弱性を開発の中で発生させない仕組みになっている。**WSGIの使用に則っている。</dd>
<dt>Flask</dt>
<dd>中小規模の開発案件に向いた軽量のWebアプリケーションフレームワーク。**標準で提供する機能が少なく、動作が軽いことが特徴。**ユーザーが自分で必要な機能を実装できることから、カスタイマイズ性の高さも魅力。WSGIの使用に則っている。</dd>
<dt>Bottle</dt>
<dd>1つのファイル(Bottle.py)だけで構成された軽量かつシンプルなフレームワーク。趣味で開発する程度で使われる。</dd>
<dt>Tornado</dt>
<dd>元々FriendFeedが開発したPythonのWebフレームワーク。ほかのPythonの他のWebフレームワークとは異なり、**非同期処理が可能**。</dd>
<dt>web2Py</dt>
<dd>web2pyは、シンプルなクロスプラットフォーム対応のWebフレームワークであり、WindowsやMac、Linuxなど異なるプラットフォーム上での実行が可能。</dd>
<dt>Plone</dt>
<dd>Ploneは企業向けCMSの作成に採用されているフレームワーク。PloneはCMSよりも導入や運用が非常に簡単で、必要な機能がそろっているという特徴がある。</dd>
></dl>

※WSGIは、サーバとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したもの。これを利用することで、WebサーバとWebアプリケーションの実装を切り離すことができ，WebサーバとWebアプリケーションフレームワークの組み合わせを柔軟に選択することができるようになる。
※CMS(Contents Management System：コンテンツ・マネジメント・システム)で、Webサイトのコンテンツを構成するテキストや画像、デザイン・レイアウト情報（テンプレート）などを一元的に保存・管理するシステムのこと。

基本的には、Djangoを勉強すれば良さそう。実際に、pythonを使ってWeb開発となると、基本的には、Djangoができれば、事足りる。有名なサイトでDjangoが使われている事は結構ある。まぁー、普段python使っているならこのフレームワークで間違いないでしょ！
##Djangoの基本的な考え
Djnagoでは、Urls、View、Model、Templateの概念が重要である。<dl>
<dt>・URL</dt>
<dd>HTTP RequestをView関数に渡す。具体的には、URLとHTTP RequestがどのView関数または、Viewオブジェクトと紐付けるかを記載する。urlpatternsがルートと対応するView関数をマッピングのリストを定義する。

```python3:urls.py
urlpatterns = [
   path('admin/', admin.site.urls),
   path('', include('api.urls'),
]
```

以上のようにurlpatternsのリスト内で、path('***/', <参照するViewオブジェクトまたは、関数>)を定義することでViewに結びつけることができる。ユーザーが指定したURL（http\://localhost:8000/admin/）と、urlpatternsに格納したすべてのpath()の初めの引数（'admin/'や'index/'）を順番に比較する。この場合、adminと一致するため、admin.site.urlsを参照することになる。
</dd>

<dt>・View</dt>
<dd>ビューは、HTTPリクエストを受け取り、HTTPレスポンスを返すリクエストハンドラ関数。

```python3:views.py
from django.http import HttpResponse

def index(request):
   return HttpResponse('Hello from Django') 
```

この関数は、ブラウザに返信されるHttpResponseを生成するために render() 関数を使う。

</dd>
<dt>・モデル</dt>
<dd>モデルは、アプリケーションのデータ構造を定義し、データベース内のレコードを管理（追加、変更、削除）および照会するための機能を提供するPythonオブジェクト。フィールドのタイプや、最大サイズ、デフォルト値、選択リストのオプション、ドキュメントのヘルプテキスト、フォームのラベルテキストなど、格納されるデータの構造を定義するのが一般。</dd>

```python3:models.py
from django.db import models

class Team(models.Model):
   team_name = models.CharField(max_length=40)
   TEAM_LEVELS = (
      ('U09', 'Under 09s'), 
      ('U09', 'Under 10s'), 
      ('U09', 'Under 11s'), 
   )
   team_level = models.CharField(max_length=3, 
                choices=TEAM_LEVELS,default='U11')
```

<dt>・テンプレート</dt>
<dd>テンプレートは、ファイルの構造やレイアウト（HTMLページなど）を定義するテキストファイルで、プレースホルダを使用して実際のコンテンツを表す。 

```html:index.html
from django.shortcuts import render
from .models import Team

<!DOCTYPE html>
<html lang="en">
<body>

 {% if youngest_teams %}
    <ul>
    {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No teams are available.</p>
{% endif %}

</body>
</html>

```

レンダリング時にyoungest_teams というリスト変数（上記のrender()関数によってコンテキスト変数に含まれます）にアクセスできる前提で作成される。HTMLスケルトンでは、youngest_teams変数が存在するかどうかを最初にチェックし、それを forループで繰り返す式がある。各繰り返しにおいて、テンプレートは各チームのteam_name値を\<li>要素に表示している。
</dd>

#まとめ
Djangoでは、HttpRequestが飛んできたら、urls.pyファイルで、どのViewを参照すればいいのかを明記して、Viewの中で、データベースにどのように反映させるか、また、どんなHttpResponseを返すかを処理している。この流れが分かっていればとりあえずは良さそう。

#参考
https://web-camp.io/magazine/archives/20695
https://proengineer.internous.co.jp/content/columnfeature/15156
https://developer.mozilla.org/ja/docs/Learn/Server-side/Django/Introduction