最初のDjangoの記事では、 "Djangoとは何ですか?" という疑問に答え、このWebフレームワークの特徴と概要を説明します。主な機能の概要と、このモジュールで詳しく説明しない高度な機能などを紹介します。 また、Djangoアプリケーションの主要な構成部品のいくつかを示します。 (この時点ではまだテストできる開発環境を持っていません).
前提条件: | 基本的なコンピューターリテラシーを持っていること。サーバーサイドウェブプログラミング の一般的な理解、特にウェブサイトにおけるクライントとサーバーのやりとりの仕組みを理解していること。 |
---|---|
目的: | Djangoが何であるか、Djangoの持つ機能、そしてDjangoアプリケーションの主要な構成部品に精通します。 |
Djangoとは何ですか?
Djangoは、安全でメンテナンス可能なWebサイトの迅速な開発を可能にする、高度なPython Webフレームワークです。経験豊富な開発者によって開発されたDjangoは、Web開発の多くの面倒事を引き受けてくれます。そのため車輪の再発明が不要で、アプリケーションを書くことに集中できます。無料でオープンソースであり、活発なコミュニティ、偉大なドキュメントがあります。また、無料と有料のサポートの多くのオプションもあります。
Djangoの以下の特徴はソフトウェアを書くのに役立ちます:
- 完全
- Djangoは "Batteries included" の哲学に従い、開発者が "すぐに" やりたいことのほとんどを提供します。必要なものはすべて1つの「製品」に含まれているため、すべてがシームレスに連携し、一貫した設計原則に従います。そして、豊富な最新のドキュメントが用意されています。
- 多彩
- Djangoは、コンテンツ管理システムやWikiからソーシャルネットワーク、ニュースサイトなど、ほとんどのタイプのWebサイトを構築できます。任意のクライアントサイドのフレームワークで動作し、HTML、RSSフィード、JSON、XMLなどのほとんどの形式のコンテンツを配信できます。現在読んでいるサイトもDjangoベースですよ!
内部的には、必要となるほとんどの機能(人気のあるデータベースやテンプレートエンジンなど)の選択肢を提供していますが、他のコンポーネントを使用するように拡張もできます。 - 安全
- Djangoは、Webサイトを自動的に保護するために "正しいことをする" ように設計されたフレームワークです。多くの一般的なセキュリティミスを開発者が避けられるようにできています。例えば、セッション情報を脆弱な場所に置いたり、パスワードを直接保存するといった一般的なミスをDjangoでは避けるようになっています。セッション情報は、クッキーにセッションキーだけを格納し、実際のセッションデータはデータベースに保存されます。パスワードはパスワードハッシュをデータベースに格納します。このようにユーザーアカウントとパスワードを安全に管理する方法を提供しています。
パスワードハッシュは、送信されたパスワードから 暗号化ハッシュ関数を介して生成された固定長の値です。 Djangoは入力されたパスワードが正しいかどうかを、ハッシュ関数を介した値と保存されたハッシュ値を比較することでチェックできます。これは "一方向性" の機能であり、もし保存されているハッシュ値が侵害されても、攻撃者が元のパスワードを解読するのは困難です。
Djangoは、SQLインジェクション、クロスサイトスクリプティング(XSS)、クロスサイトリクエストフォージェリ(CSRF)、クリックジャッキングなどの多くの脆弱性に対する保護が有効です(これらの攻撃についての詳細は、 ウェブサイトのセキュリティ を参照してください)。 - スケーラブル
- Djangoはコンポーネントベースの “シェアードナッシング” アーキテクチャを採用しています(アーキテクチャの各部分は他と独立しており、必要に応じて置き換え、変更できます)。異なる部分を明確に分離しているため、キャッシュサーバー、データベースサーバー、アプリケーションサーバーの各ハードウェアをそれぞれ追加することによって、トラフィックの増加に合わせてスケールできるようになっています。いくつかの最も忙しいサイトは、ニーズを満たすためにDjangoを適切にスケールさせています(InstagramやDisqusなど)
- メンテナンス可能
- Djangoのコードは、保守可能で再利用可能になるような設計原則、デザインパターンを使って書かれています。特に、Do not Repeat Yourself(DRY)原則によって不要な複製がなく、コード量を削減します。Djangoは、関連する機能を再利用可能な "アプリケーション" にグループ化し、低いレベルでは関連するコードをモジュールにグループ化します(モデルビューコントローラ(MVC)パターンに沿っています)。
- ポータブル
- Djangoのコードは多くのプラットフォームで動作するPythonで書かれています。これはあなたがプラットフォームに縛られていないことを意味します。アプリケーションは多くの種類のLinux、Windows、Mac OS Xで実行できます。さらに、Djangoは多くのホスティングプロバイダによってよくサポートされています。Djangoサイトを特定のインフラストラクチャでホスティングするために、ドキュメントを提供していることが多いです。
どこから来たの?
Djangoは当初、2003年から2005年の間に、新聞のウェブサイトの作成とメンテナンスを担当するWebチームによって開発されました。いくつかのサイトを作成した後、チームは多くの共通コードとデザインパターンを除外、再利用するようになりました。この共通コードは、"Django" プロジェクトとして2005年7月にオープンソース化され、汎用のWeb開発フレームワークに発展しました。
Djangoは、2008年9月の最初のマイルストーンリリース(1.0)から、最新のリリースバージョンである2.0(2017)まで、成長を続けています。 各リリースでは、新しいタイプのデータベース、テンプレートエンジン、キャッシュのサポートから、"汎用"ビュー機能とクラスの追加(プログラミングタスクで開発者が記述しなければならないコード量を削減します)などの新機能追加やバグフィックスがありました。
ノート: DjangoのWebサイトの リリースノート をチェックして、最近のバージョンで何が変わったのか、どのような作業がDjangoを改善しているのか確認してください。
Djangoは現在、活発なオープンソースプロジェクトであり、何千人ものユーザーとコントリビュータがいます。元々の起源に関連するいくつかの機能はまだありますが、DjangoはあらゆるタイプのWebサイトを開発できる汎用フレームワークに進化しました。
Djangoはどれくらい普及していますか?
サーバーサイドのフレームワークの普及率を決定的に測定する、すぐに利用できるものはありません (Hot Frameworks のようなサイトでは、GitHubプロジェクトの数や、各プラットフォームのStackOverflowの質問数をカウントするなどのメカニズムを使用して人気を評価しています) より良い質問は、「人気のないプラットフォームで問題を避けるために、Djangoは "人気がある" かどうか」、「それは進化し続けていますか?」「必要なときに助けを得ることができますか?」「Djangoを学べば、仕事を得る機会がありますか?」などです。
Djangoを使用している有名なサイトの数、コードベースにコントリビュートする人数、無料と有料の両方でサポートを提供する人数に基づいて、Djangoは普及しているフレームワークと言えるでしょう。
Djangoを使用している有名なサイト: Disqus、Instagram、Knight Foundation、MacArthur Foundation、Mozilla、National Geographic、Open Knowledge Foundation、Pinterest、Open Stack (ソース: Djangoホームページ)
Djangoはこだわりが強いですか?
Webフレームワークは、自身を "こだわりが強い" か "こだわりが強くない" と呼ぶことがあります。
こだわりが強いフレームワークは、特定のタスクを処理するための "正しい方法" についてこだわりを持っています。特定のドメイン(特定の種類の問題の解決)は、どのように扱うと正しいか、広く知られており、文書化もされているため、迅速な開発をサポートします。 しかし、主ドメイン以外の問題解決において柔軟性を欠き、使用できるコンポーネントのやアプローチの選択肢が少なくなる傾向があります。
対照的に、こだわりの強くないフレームワークは、目的を達成するための最善の結合されたコンポーネントの提供や、使用するコンポーネントを制限することが非常に少ないです。開発者は、特定のタスクを完了するために最も適したツールを簡単に使用できます。ただし、それらのコンポーネントを自分で見つける必要があります。
Djangoは "多少こだわりがある" ので、 "両方の世界のベスト" を提供します。 ほとんどのWeb開発タスクを処理するための一連のコンポーネントと、それを使う1つ(または2つ)の正しい方法を提供します。Djangoの分離アーキテクチャでは、通常、さまざまなオプションから選択しますが、必要に応じて新しいオプションを追加できます。
Djangoコードはどのように見えますか?
昔ながらのデータ駆動型Webサイトでは、WebアプリケーションはWebブラウザ(または他のクライアント)からのHTTPリクエストを待ちます。リクエストを受信すると、アプリケーションは、URLおよび、GET
や POST
データの情報に基づいて必要な処理を行います。 必要に応じてデータベースの情報を読み書きしたり、要求を満たすために必要なタスクを実行できます。 アプリケーションはWebブラウザに応答を返す際、検索したデータをHTMLテンプレートのプレースホルダに挿入し、動的にHTMLページを生成することがよくあります。
Django Webアプリケーションは、通常、これらの各ステップを処理するコードを別々のファイルにグループ化します:
- URL: 単一URLから単一の関数を介してすべてのリクエストを処理することは可能ですが、各リソースを処理する別々のビュー関数を作成する方がはるかにメンテナンスが容易です。 URLマッパーは、URLに基づいてHTTPリクエストを適切なビューにリダイレクトするために使われます。 URLマッパーは、URLに含まれる特定のパターンの文字列または数字を照合し、これらをデータとしてビュー関数に渡すこともできます。
- ビュー: ビューは、HTTPリクエストを受け取り、HTTPレスポンスを返すリクエストハンドラ関数です。ビューは、モデルを介して要求を満たすために必要なデータにアクセスし、レスポンスのフォーマットをテンプレートに委任します。
- モデル: モデルは、アプリケーションのデータ構造を定義し、データベース内のレコードを管理(追加、変更、削除)および照会するための機能を提供するPythonオブジェクトです。
- テンプレート: テンプレートは、ファイルの構造やレイアウト(HTMLページなど)を定義するテキストファイルで、プレースホルダを使用して実際のコンテンツを表します。 ビューは、モデルから取得したデータとHTMLテンプレートを使用して動的にHTMLページを作成できます。 テンプレートを使用して、あらゆる種類のファイル(HTMLである必要はありません!)の構造を定義できます。
ノート: Djangoはこの構成を "モデルビューテンプレート(Model View Template, MVT)" アーキテクチャと呼んでいます。これは Model View Controller アーキテクチャとよく似ています。
以下のセクションでは、Djangoアプリケーションの主要部分の外観について説明します(開発環境を設定後、詳しく説明します)。
リクエストを正しいビューに送信する(urls.py)
URLマッパーは通常、urls.pyという名前のファイルに格納されます。以下の例では、マッパー(urlpatterns
)はルート(特定のURLパターン) と対応するビュー関数のマッピングのリストを定義します。指定されたパターンと一致するURLを持つHTTPリクエストが受信されると、関連するビュー関数が呼び出され、リクエストを渡します。
urlpatterns = [ path('admin/', admin.site.urls), path('book/<int:id>/', views.book-detail, name='book_detail'), path('catalog/', include('catalog.urls')), re_path(r'^([0-9]+)/$', views.best), ]
urlpatterns
オブジェクトはpath()
やre_path()
関数のリストです(Pythonのリストは角括弧を使って定義され、アイテムはカンマ区切りです。末尾のカンマは任意です。例: [item1, item2, item3,]
)
両方の関数の最初の引数は、一致させたいルート(パターン)です。path()
関数では、かぎ括弧を使って、ビュー関数に名前付き引数として渡されるURLの部分を定義します。 re_path()
関数では、柔軟なパターンマッチング方法として知られている正規表現を使います。 これらについては後の記事で説明します。
2つ目の引数は、パターンに一致したときに呼び出される別の関数です。views.book_detail
という表記は、呼び出されたviews
モジュール内(views.py
という名前のファイル内部)で見つかるbook_detail()
関数が呼び出されることを示します。
リクエストの処理(views.py)
ビューは、Webアプリケーションの中心であり、WebクライアントからHTTPリクエストを受け取り、HTTPレスポンスを返します。その中では、データベースにアクセスしたり、テンプレートをレンダリングしたりして、フレームワークの他のリソースを変換します。
以下の例は、前のセクションのURLマッパーによって呼び出される最小限の index()
ビュー関数を示しています。すべてのビュー関数と同様に、HttpRequest
オブジェクトをパラメータ(request
)として受け取り、HttpResponse
オブジェクトを返却します。この場合、リクエストには何もしません。レスポンスはハードコードされた文字列を返します。後のセクションで、もっと興味深いことをするリクエストを示します。
## filename: views.py (Django view functions)
from django.http import HttpResponse
def index(request):
# Get an HttpRequest - the request parameter
# perform operations using information from the request.
# Return HttpResponse
return HttpResponse('Hello from Django!')
ノート: Pythonについて少し:
- Pythonモジュールは、コードで使用したい関数を別々のファイルに格納した"ライブラリ"です。ここでは、
HttpResponse
オブジェクトをdjango.http
モジュールからインポートし、ビューで使用できるようにします:from django.http import HttpResponse
モジュールからオブジェクトの一部または全部をインポートする方法は他にもあります。 - 関数は、上記のように
def
キーワードを使用して宣言し、名前付きのパラメータは関数の名前の後に括弧内に列挙します。行全体はコロンで終わります。次の行がどのようにインデントされているかに注意してください。インデントは重要です。コード行が特定のブロックの内側にあることを指定しています(必須のインデントは、Pythonの重要な機能であり、Pythonコードを読むのが簡単な理由の1つです)。
ビューは通常 views.py ファイルに格納します。
データモデルの定義(models.py)
Django Webアプリケーションは、モデルと呼ばれるPythonオブジェクトを通じてデータを管理し、クエリを実行します。モデルは、フィールドのタイプや、最大サイズ、デフォルト値、選択リストのオプション、ドキュメントのヘルプテキスト、フォームのラベルテキストなど、格納されるデータの構造を定義します。モデルの定義は、下層のデータベース(プロジェクト設定でいくつかから選択できます)からは独立しています。使用したいデータベースを選択したあとは、直接そのデータベースとやりとりする必要はありません。モデル構造と他のコードを書くだけで、Djangoはデータベースとのやりとりのすべての面倒な作業を処理します。
以下のコードスニペットは、Team
オブジェクトの非常に単純なDjangoモデルを示しています。Team
クラスは、Djangoのmodels.Model
クラスを継承しています。これは、チーム名とチームレベルを文字列フィールドとして定義し、各レコードに格納する最大文字数を指定します。team_level
はいくつかの値の一つになる可能性があります。したがって、この値を選択フィールドとして定義し、表示する選択項目と保存するデータの間のマッピングをデフォルト値とともに提供します。
# filename: models.py
from django.db import models
class Team(models.Model):
team_name = models.CharField(max_length=40)
TEAM_LEVELS = (
('U09', 'Under 09s'),
('U10', 'Under 10s'),
('U11', 'Under 11s'),
... #list other team levels
)
team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')
ノート: Pythonについて少し:
- Pythonは "オブジェクト指向プログラミング" をサポートしています。これは、データとそのデータを操作するための関数を含むオブジェクトにコードを組み上げるプログラミングのスタイルです。オブジェクトは、他のオブジェクトから継承/拡張/派生することができ、関連するオブジェクト間の共通の動作を共有できます。 Pythonでは
class
キーワードを使用してオブジェクトの "ブループリント" を定義します。クラス内のモデルに基づくオブジェクトタイプの複数のインスタンスを作成できます。
たとえば、ここではModel
クラスから派生したTeam
クラスがあります。 これは、それがモデルであり、モデルのすべてのメソッドを含むことを意味しますが、独自の特別な機能も提供できます。我々のモデルでは、データベースにデータを格納するために必要なフィールドを定義し、名前を付けます。Djangoは、フィールド名を含むこれらの定義を使用して、下層のデータベースを作成します。
データの問い合わせ(views.py)
Djangoモデルは、データベースを検索するための簡単なクエリAPIを提供します。これは、さまざまな照合基準(例:完全一致、大文字小文字を区別しない、大なりなど)を使用して一度にいくつかのフィールドと照合でき、複雑なステートメントをサポートできます(たとえば、「U11チームのうち、"Fr"で始まるか"al"で終わる名前」)。
コードスニペットには、U09チームのすべてを表示するためのビュー機能(リソースハンドラ)が示されています。太字の線は、モデルクエリAPIを使用して、team_level
フィールドに完全一致でテキスト 'U09' があるすべてのレコードをフィルタリングする方法を示しています。 (filter()
関数には、照合基準としてフィールド名とマッチタイプをダブルアンダースコアで区切った引数で渡していることに注意してください: team_level__exact)
## filename: views.py
from django.shortcuts import render
from .models import Team
def index(request):
list_teams = Team.objects.filter(team_level__exact="U09")
context = {'youngest_teams': list_teams}
return render(request, '/best/index.html', context)
この関数は、ブラウザに返信されるHttpResponse
を生成するために render()
関数を使います。この関数はショートカットです。指定されたHTMLテンプレートとテンプレートに挿入するいくつかのデータ("context
"という名前の変数で提供される)を組み合わせてHTMLファイルを作成します。次のセクションでは、HTMLを作成するためにテンプレートにデータがどのように挿入されているかを示します。
データのレンダリング(HTMLテンプレート)
テンプレートシステムでは、出力ドキュメントの構造を指定できます。ページの生成時に埋められるデータはプレースホルダを使用します。テンプレートはHTMLを作成するためによく使われますが、他のタイプドキュメントも作成できます。Djangoはネイティブのテンプレートシステムと、Jinja2と呼ばれる一般的なPythonライブラリの両方をサポートしています。(必要に応じて他のシステムもサポートできます)
コードスニペットは、前のセクションの render()
関数で呼び出されるHTMLテンプレートの外観を示しています。 このテンプレートは、レンダリング時にyoungest_teams
というリスト変数(上記のrender()
関数によってコンテキスト変数に含まれます)にアクセスできる前提で作成されています。HTMLスケルトンでは、youngest_teams
変数が存在するかどうかを最初にチェックし、それを for
ループで繰り返す式があります。各繰り返しにおいて、テンプレートは各チームのteam_name
値を<li>
要素に表示します。
## filename: best/templates/best/index.html
<!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>
他に何ができますか?
前のセクションでは、ほとんどのWebアプリケーションで使用する主な機能(URLマッピング、ビュー、モデルおよびテンプレート)を示しました。Djangoが提供する他の機能のいくつかを紹介します:
- フォーム: HTMLフォームはユーザーデータを集めて、サーバー上で処理するために使われます。Djangoは、フォームの作成、検証、および処理を簡素化します。
- ユーザー認証と権限: Djangoは、セキュリティを考慮して構築された強固なユーザー認証および権限システムを含んでいます。
- キャッシュ: コンテンツを動的に作成することは、静的なコンテンツを提供するよりもはるかに計算処理が多い(かつ低速)です。Djangoは、レンダリングされたページのすべて、または一部を保存できるように、柔軟なキャッシュを提供し、必要な場合を除いて再レンダリングされないようにします。
- 管理サイト: Djangoの管理サイトは、基本的な骨組みを使ってアプリケーションを作成すると、デフォルトで含まれています。サイト管理者がサイト内のデータモデルを作成、編集、表示するための管理ページを簡単に提供できます。
- データのシリアライズ: Djangoを使用すると、簡単にXMLやJSONとしてデータをシリアライズして提供できます。これは、Webサービス(他のアプリケーションやサイトで使われるデータを純粋に提供し、何も表示しないWebサイト)を作成する場合や、クライアントサイドのコードがすべてのデータのレンダリングする場合に便利です。
要約
おめでとう、あなたはDjangoの旅の最初のステップを完了しました!Djangoの主なメリット、歴史について少し分かって、Djangoアプリケーションの主要部分のそれぞれがどのように見えるかを理解する必要があります。リスト、関数、クラスの構文も含めて、Pythonプログラミング言語についていくつか学んだことがあります。
上記では実際のDjangoコードをいくつか見ましたが、クライアントサイドのコードとは異なり、実行するための開発環境をセットアップする必要があります。それが次のステップです。
このモジュール内
- Django の紹介
- Django 開発環境の設定
- Django チュートリアル: 地域図書館ウェブサイト
- Django チュートリアル Part 2: ウェブサイトの骨組み作成
- Django チュートリアル Part 3: モデルの使用
- Django チュートリアル Part 4: Django 管理サイト
- Django チュートリアル Part 5: ホームページの作成
- Django チュートリアル Part 6: 汎用の一覧表示と詳細表示
- Django チュートリアル Part 7: セッションフレームワーク
- Django チュートリアル Part 8: ユーザー認証と権限
- Django チュートリアル Part 9: フォームの操作
- Django チュートリアル Part 10: Django ウェブアプリケーションのテスト
- Django チュートリアル Part 11: Django を本番環境にデプロイする
- Django ウェブアプリケーションセキュリティ
- DIY Django ミニブログ