0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django入門:kidsPlayGroundアプリで学ぶWeb開発の基本

Posted at

このガイドでは、kidsPlayGround アプリケーションを例に、Djangoを使ったWebアプリケーション開発の基本的な考え方、構造、そして実践的なテクニックを初心者向けに解説します。

1. Djangoとは?なぜDjangoを使うのか?

Djangoは、Pythonで書かれた高機能なWebフレームワークです。WebサイトやWebアプリケーションを迅速かつ効率的に開発するために設計されており、「DRY (Don't Repeat Yourself)」の原則と「バッテリー同梱 (Batteries included)」の思想を重視しています。

kidsPlayGround アプリケーションでは、ユーザー管理、施設情報表示、レビュー投稿、お気に入り機能など、多くの機能がDjangoによって実現されています。

Djangoを使うメリット:

  • 高速開発: 多くの機能が標準で提供されており、ゼロから書く手間を省けます。
  • セキュリティ: クロスサイトスクリプティング (XSS) やクロスサイトリクエストフォージェリ (CSRF) など、一般的なWeb攻撃に対する保護機能が組み込まれています。
  • スケーラビリティ: 大規模なトラフィックにも対応できるよう設計されています。
  • 豊富なライブラリ: 多くのサードパーティ製ライブラリがあり、機能拡張が容易です。

2. Djangoプロジェクトの基本的な作り方と構成

Djangoプロジェクトは、複数の「アプリ」で構成されます。プロジェクトはWebサイト全体を管理し、アプリは特定の機能(例: ユーザー管理、ブログ、施設情報)を担当します。

kidsPlayGround プロジェクトの主要なディレクトリ構造を見てみましょう。

/home/jam/kidsPlayGround/
├───manage.py           # Djangoプロジェクトを操作するためのコマンドラインユーティリティ
├───mysite/             # プロジェクトのメイン設定ディレクトリ
│   ├───__init__.py
│   ├───asgi.py
│   ├───urls.py         # プロジェクト全体のURLルーティング
│   ├───wsgi.py
│   └───settings/       # プロジェクト設定(開発用、本番用など)
├───accounts/           # ユーザー管理関連のアプリ
│   ├───__init__.py
│   ├───admin.py
│   ├───apps.py
│   ├───models.py       # ユーザーモデルの定義
│   ├───urls.py         # accountsアプリのURLルーティング
│   └───views.py        # accountsアプリのビュー(ロジック)
├───myapp/              # 施設情報、レビュー、お気に入りなどの主要機能アプリ
│   ├───__init__.py
│   ├───admin.py
│   ├───apps.py
│   ├───models.py       # 施設、レビュー、お気に入りモデルの定義
│   ├───urls.py         # myappアプリのURLルーティング
│   ├───views/          # myappアプリのビュー(ロジック)
│   └───templates/      # myappアプリのテンプレート(HTML)
└───templates/          # プロジェクト共通のテンプレート
    └───base.html       # 全ページ共通のベーステンプレート

基本的な開発の流れ:

  1. プロジェクトとアプリの作成:

    django-admin startproject mysite .
    python manage.py startapp myapp
    
  2. settings.py の設定: mysite/settings/base.py (または settings.py) に作成したアプリを追加し、データベース設定などを行います。

    # mysite/settings/base.py
    INSTALLED_APPS = [
        # ...
        'myapp',
        'accounts',
        # ...
    ]
    
  3. モデルの定義 (models.py): データベースの構造をPythonのクラスで定義します。
    kidsPlayGroundmyapp/models.py には Playground (施設), Review (レビュー), Favorite (お気に入り) などのモデルが定義されています。

    # myapp/models.py の例
    from django.db import models
    from django.conf import settings
    
    class Playground(models.Model):
        name = models.CharField(max_length=200)
        address = models.CharField(max_length=255)
        # ...
    
    class Review(models.Model):
        playground = models.ForeignKey(Playground, on_delete=models.CASCADE)
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
        content = models.TextField()
        rating = models.IntegerField()
        # ...
    
  4. マイグレーションの実行: モデルの変更をデータベースに反映します。

    python manage.py makemigrations
    python manage.py migrate
    
  5. ビューの作成 (views.py): ユーザーからのリクエストを処理し、レスポンスを生成するロジックを記述します。
    kidsPlayGroundmyapp/views/detail_views.pymyapp/views/ranking_views.py がその例です。

    # myapp/views/detail_views.py の例
    from django.views.generic import DetailView
    from myapp.models import Playground
    
    class FacilityDetailView(DetailView):
        model = Playground
        template_name = "myapp/facility_detail.html"
        context_object_name = "playground"
    
  6. URLルーティングの設定 (urls.py): URLとビューを紐付けます。
    プロジェクト全体の mysite/urls.py と、各アプリの urls.py があります。

    # myapp/urls.py の例
    from django.urls import path
    from . import views
    
    app_name = 'myapp'
    urlpatterns = [
        path('facility/<int:pk>/', views.detail_views.FacilityDetailView.as_view(), name='facility_detail'),
        # ...
    ]
    
    # mysite/urls.py の例
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('myapp/', include('myapp.urls')),
        # ...
    ]
    
  7. テンプレートの作成 (templates/): HTMLファイルを記述し、ビューから渡されたデータを表示します。
    kidsPlayGround では templates/base.html が共通のレイアウトを提供し、各アプリのテンプレートが具体的なコンテンツを定義します。

2.5. DjangoのMVT(Model-View-Template)パターン

Djangoは、Webアプリケーション開発においてMVT(Model-View-Template)というアーキテクチャパターンを採用しています。これは、伝統的なMVC(Model-View-Controller)パターンに似ていますが、Djangoの役割分担に合わせて調整されています。

  • Model(モデル): データの構造とビジネスロジックを扱います。データベースとのやり取りを担当し、データの保存、取得、更新、削除などを行います。kidsPlayGround アプリケーションでは、myapp/models.py に定義されている PlaygroundReview などがモデルにあたります。
  • View(ビュー): ユーザーからのリクエストを受け取り、適切なモデルとテンプレートを連携させてレスポンスを生成します。ビジネスロジックの実行、データの取得、テンプレートへのデータの受け渡しなどを行います。Djangoのビューは、MVCの「コントローラー」の役割と一部「ビュー」の役割を兼ねています。kidsPlayGround アプリケーションでは、myapp/views/ ディレクトリ内の各ビューファイル(例: detail_views.py, ranking_views.py)がビューにあたります。
  • Template(テンプレート): ユーザーインターフェース(UI)を定義します。HTML、CSS、JavaScriptなどを用いて、ユーザーに表示される内容を記述します。ビューから渡されたデータを受け取り、動的なWebページを生成します。kidsPlayGround アプリケーションでは、templates/ ディレクトリや各アプリの templates/ ディレクトリ内のHTMLファイルがテンプレートにあたります。

MVTの考え方でアプリを作るには:

  1. Modelから始める: まず、アプリケーションが扱うデータの種類と、それらのデータ間の関係を定義します。これが models.py になります。
  2. URLを設計する: ユーザーがどのようにアプリケーションの機能にアクセスするかを考え、URLパターンを設計します。これはプロジェクトとアプリの urls.py に記述します。
  3. Viewを実装する: 設計したURLパターンに対応するビューを作成します。ビューは、URLから受け取った情報(例: 施設ID)を使ってモデルからデータを取得し、そのデータをテンプレートに渡す役割を担います。
  4. Templateを作成する: ビューから渡されたデータを受け取り、ユーザーに表示するためのHTML構造をテンプレートで作成します。

このMVTパターンに従うことで、コードの役割が明確になり、開発がしやすくなります。

3. django-allauth との連携

django-allauth は、Djangoアプリケーションに認証(サインアップ、ログイン、パスワードリセットなど)機能を簡単に追加できる強力なサードパーティ製ライブラリです。kidsPlayGround アプリケーションでもユーザー認証に利用されています。

主な特徴:

  • メールアドレスでのサインアップ/ログイン
  • ソーシャルアカウント連携(Google, GitHubなど)
  • パスワードリセット
  • メールアドレス確認

連携のポイント:

  1. インストール: pip install django-allauth
  2. settings.py の設定: INSTALLED_APPSallauth 関連のアプリを追加し、認証バックエンドやメール設定を行います。
    # mysite/settings/base.py の一部
    INSTALLED_APPS = [
        # ...
        'allauth',
        'allauth.account',
        'allauth.socialaccount',
        # ...
    ]
    
    AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
        'allauth.account.auth_backends.AuthenticationBackend',
    )
    
    SITE_ID = 1 # django.contrib.sites が必要
    LOGIN_REDIRECT_URL = '/'
    ACCOUNT_LOGOUT_REDIRECT_URL = '/'
    ACCOUNT_EMAIL_REQUIRED = True
    ACCOUNT_USERNAME_REQUIRED = False # ユーザー名ではなくメールアドレスで認証
    ACCOUNT_AUTHENTICATION_METHOD = 'email'
    ACCOUNT_EMAIL_VERIFICATION = 'mandatory' # メール確認を必須にする
    
  3. urls.py の設定: allauth のURLをプロジェクトの urls.py に含めます。
    # mysite/urls.py の一部
    urlpatterns = [
        # ...
        path('accounts/', include('allauth.urls')),
    ]
    

これにより、accounts/signup/accounts/login/ といったURLで、django-allauth が提供する認証画面が利用できるようになります。

4. ベストプラクティスと便利機能、Tips

Djangoでの開発をより効率的かつ堅牢にするためのベストプラクティスや便利な機能、そして開発のヒントを紹介します。kidsPlayGround アプリケーションでもこれらの多くが活用されています。

a. 静的ファイル (Static Files) とメディアファイル (Media Files) の管理

Webアプリケーションでは、CSS、JavaScript、画像などの「静的ファイル」と、ユーザーがアップロードする写真などの「メディアファイル」を適切に管理することが重要です。

  • 静的ファイル: Webサイトの見た目を構成する、サーバー側で変更されないファイルです。Djangoでは、各アプリの static ディレクトリに配置し、settings.pySTATIC_URLSTATICFILES_DIRS を設定することで、これらを一元的に管理できます。テンプレート内では {% load static %} タグと {% static 'path/to/file' %} を使って簡単に参照できます。kidsPlayGround アプリケーションでは、myapp/static/css/ranking.css のように、アプリ固有のスタイルシートを管理しています。
  • メディアファイル: ユーザーが投稿した画像や動画など、アプリケーションの実行中に動的に生成・変更されるファイルです。settings.pyMEDIA_URLMEDIA_ROOT を設定することで、これらのファイルを安全に保存し、Webからアクセスできるようにします。

b. テンプレートの継承による効率的なUI構築

Djangoのテンプレートエンジンは「テンプレートの継承」という強力な機能を提供します。これにより、Webサイト全体の共通部分(ヘッダー、フッター、ナビゲーションバーなど)を一つのベーステンプレート(例: templates/base.html)で定義し、各ページのテンプレートはそれを継承して、固有のコンテンツのみを記述することができます。

kidsPlayGround アプリケーションの templates/base.html は、まさにこの役割を担っています。各ページは {% extends 'base.html' %} を使ってこのベーステンプレートを継承し、{% block content %} のようなブロックをオーバーライドして具体的な内容を挿入します。これにより、コードの重複を防ぎ、Webサイト全体の一貫したデザインとメンテナンス性を保つことができます。

c. カスタムマネージャーでクエリを整理

Djangoのモデルマネージャーは、データベースクエリを抽象化し、再利用可能なメソッドとして定義するための強力なツールです。特に、特定の条件でデータを取得したり、複雑な集計を行ったりする場合に「カスタムマネージャー」を作成すると、ビューのコードがすっきりと整理され、可読性と再利用性が向上します。

kidsPlayGround アプリケーションの myapp/models.py には、PlaygroundManager のようなカスタムマネージャーが定義されています。例えば、Playground.objects.get_by_rating_rank() のように、施設を評価順で取得するカスタムメソッドを定義することで、ビュー側では Playground.objects.get_by_rating_rank() と呼び出すだけで、複雑なクエリロジックを意識せずに済みます。

d. 汎用クラスベースビュー (Generic Class-Based Views) の活用

Djangoは、Web開発でよくあるパターン(オブジェクトの表示、リスト表示、フォーム処理など)を効率的に実装するための「汎用クラスベースビュー (GCBV)」を提供しています。これらを利用することで、定型的なコードを大幅に削減し、開発速度を向上させることができます。

kidsPlayGround アプリケーションでも、これらの汎用ビューが活用されています。

  • DetailView (詳細表示): 単一のオブジェクトの詳細を表示する際に使用します。
    kidsPlayGroundmyapp/views/detail_views.py にある FacilityDetailView がその例です。

    # myapp/views/detail_views.py
    from django.views.generic import DetailView
    from myapp.models import Playground
    
    class FacilityDetailView(DetailView):
        model = Playground
        template_name = "myapp/facility_detail.html"
        context_object_name = "playground"
    

    このビューは、URLから渡された主キー(pk)に基づいて Playground オブジェクトを自動的に取得し、指定されたテンプレートに playground という名前で渡します。

  • ListView (リスト表示): オブジェクトのリストを表示する際に使用します。
    kidsPlayGroundmyapp/views/ranking_views.py にある RankingListView がその例です。

    # myapp/views/ranking_views.py
    from django.views.generic import ListView
    from myapp.models import Playground
    
    class RankingListView(ListView):
        model = Playground
        template_name = "ranking/list.html"
        context_object_name = "playgrounds"
    
        def get_queryset(self):
            # カスタムロジックでクエリセットをカスタマイズ
            # 例: 評価順や口コミ数順でソート
            return Playground.objects.all() # 実際はカスタムマネージャーを使用
    

    ListView は、model で指定されたオブジェクトのリストを自動的に取得し、テンプレートに渡します。get_queryset メソッドをオーバーライドすることで、表示するデータのフィルタリングやソートなどのカスタムロジックを追加できます。

これらの汎用ビューを理解し活用することで、Djangoアプリケーションのビュー層をより簡潔かつ強力に記述できるようになります。

e. テストの重要性と堅牢なテストの書き方

ソフトウェア開発において、テストはコードが期待通りに動作することを保証し、将来の変更による予期せぬバグを防ぐために不可欠です。Djangoはテストフレームワークを内蔵しており、簡単にテストを記述・実行できます。

kidsPlayGround プロジェクトでは、tests/ ディレクトリに多くのテストファイルがあります。これらのテストは、機能の追加や変更があった際に、既存の機能が壊れていないかを確認する「安全網」の役割を果たします。

堅牢なテストのベストプラクティス(twadaさんの哲学を参考に):

  • 振る舞いをテストする: テストは、コードの「何ができるか」(振る舞い)に焦点を当てるべきであり、「どのように実装されているか」(実装の詳細)に依存すべきではありません。例えば、特定のHTML構造やCSSクラス名に依存するUIテストは、UIの変更によってすぐに壊れてしまうため「壊れやすいテスト」とされます。代わりに、ユーザーがボタンをクリックしたときにデータが正しく保存されるか、といった機能的な振る舞いを検証します。
  • 1テスト1検証: 1つのテストケースでは、1つの具体的な振る舞いのみを検証します。これにより、テストが失敗した際に、どの部分に問題があるのかを素早く特定できます。
  • 明確なテストケース名: テストケース名(test 関数の第一引数)は、日本語で具体的なシナリオと期待される結果を記述します。これにより、テストコード自体が「動く仕様書」として機能し、他の開発者にとっても理解しやすくなります。

5. まとめ

Djangoは、強力で柔軟なWebフレームワークであり、kidsPlayGround のような多様な機能を備えたアプリケーションを効率的に構築できます。モデル、ビュー、テンプレートのMVC(またはMTV)パターン、再利用可能なアプリの概念、そして豊富なサードパーティライブラリとの連携により、開発者はビジネスロジックに集中できます。

このガイドが、Djangoを使ったWeb開発の第一歩を踏み出す助けとなれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?