Djangoフレームワークの基礎と実践的な使い方

Webアプリケーションの基本概念

1.1 Webアプリケーションとは

ブラウザを通じて利用できるアプリケーションを指します。

1.2 ソフトウェア開発モデル

  • C/Sモデル: クライアントとサーバーの関係
  • B/Sモデル: ブラウザとサーバーの関係(C/Sの一種)

サーバーは24時間稼働し、サービスを提供する必要があります。

1.3 Webアプリケーションの利点

  • ブラウザのみで利用可能
  • 複数アプリケーションのクライアントを1つに統合
  • クライアントの更新不要、サーバー側で更新即可
  • クロスプラットフォーム対応

1.4 Webアプリケーションの課題

  • サーバー障害でクライアントへの影響
  • ブラウザ間の互換性問題

1.5 Webフレームワーク

特定の場所に特定のコードを記述する(メインの構造)。

1.6 Pythonの主要フレームワーク

  • Django: 大規模で機能豊富(航空母艦型)
  • Flask: 軽量でモジュール依存型
  • Tornado: 非同期で高パフォーマンス

2. MVCとMTVモデル

2.1 MVC

  • M: Model(データ処理)
  • V: View(HTMLページ)
  • C: Controller(ロジック処理)

2.2 MTV

  • M: Model(データ関連)
  • T: Template(HTMLページ)
  • V: View(ロジック処理)

Python環境でのMVCとMTVの対応関係を示しています。

3. Djangoのインストールとプロジェクト作成

3.1 Djangoのバージョン

  • Django1.x: 既存プロジェクト
  • Django2.x: 新規プロジェクト
  • Django3.x: 最新バージョン

3.2 Djangoのインストール

# コマンドライン
pip install django
pip install django==3.2.10  # 特定バージョン

# PyCharm
設定 > Pythonインタプリタ > 検索してインストール

3.3 プロジェクト作成

# コマンドライン
django-admin startproject my_project

# PyCharm
File > New Project > Django > Pythonインタプリタを選択

3.4 プロジェクトの起動

# コマンドライン
python manage.py runserver 8000

# PyCharm
プロジェクトの実行アイコンをクリック

3.5 アプリケーションの作成

# コマンドライン
python manage.py startapp user_management

# PyCharm
Tools > Run manage.py Task > startapp user_management

4. 主要ファイル構造

  • my_project/: プロジェクトディレクトリ
  • user_management/: アプリケーションディレクトリ
  • settings.py: 設定ファイル
  • urls.py: ルーティング設定
  • views.py: ビュー処理
  • models.py: データモデル
  • templates/: HTMLテンプレート

5. Djangoの基本メソッド

5.1 HttpResponse

from django.http import HttpResponse

def home_view(request):
    return HttpResponse("Djangoの基本例")

5.2 render

from django.shortcuts import render
import datetime

def home_view(request):
    current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    return render(request, "home.html", {"time": current_time})

5.3 redirect

from django.shortcuts import redirect

def home_view(request):
    return redirect("/about/")

6. 静的ファイルの設定

静的ファイル(CSS、JS、画像など)はstaticディレクトリに配置します。

# settings.py
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

# HTMLで使用
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">

7. リクエスト処理

# GETリクエスト
request.GET.get("param", "")
request.GET.getlist("param", [])

# POSTリクエスト
request.POST.get("param", "")
request.POST.getlist("param", [])

8. フォーム処理

フォームの送信方法にはGETとPOSTがあります。

  • GET: パラメータがURLに含まれる
  • POST: パラメータがリクエストボディに含まれる

9. データベース接続

MySQL接続の設定例:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_db',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'}
    }
}

10. ORMの基本操作

10.1 モデルの定義

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)

10.2 データ操作

# 作成
Product.objects.create(name="Item1", price=100.0)

# 取得
products = Product.objects.all()
first_product = Product.objects.first()

# 更新
product = Product.objects.get(id=1)
product.price = 200.0
product.save()

# 削除
product = Product.objects.get(id=1)
product.delete()

11. ルーティング設定

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('home/', views.home, name='home'),
    path('about/', views.about, name='about'),
]

11.1 名前付きルーティング

# 反向解析
reverse('home')  # '/home/'
reverse('about')  # '/about/'

# テンプレートでの使用
<a href="{% url 'home' %}">ホーム</a>

12. JSONレスポンス

from django.http import JsonResponse

def api_view(request):
    data = {
        "status": "success",
        "data": {"message": "Hello from Django"}
    }
    return JsonResponse(data)

13. ファイルアップロード

ファイルアップロードの設定:

# HTML
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="file_upload">
    <input type="submit" value="アップロード">
</form>

# ビュー
def upload_view(request):
    if request.method == "POST":
        uploaded_file = request.FILES.get("file_upload")
        with open(uploaded_file.name, "wb") as f:
            for chunk in uploaded_file.chunks():
                f.write(chunk)
        return HttpResponse("アップロード成功")

14. CBVとFBV

クラスベースビュー(CBV)と関数ベースビュー(FBV)の違い:

# CBV
from django.views import View

class LoginView(View):
    def get(self, request):
        return render(request, "login.html")
    
    def post(self, request):
        return HttpResponse("POSTリクエスト処理")

15. テンプレートシステム

15.1 変数の表示

{{ variable }}
{{ user.name }}
{{ user.get_full_name }}

15.2 フィルタの使用

{{ date|date:"Y-m-d" }}
{{ text|truncatechars:50 }}
{{ value|default:"N/A" }}

15.3 テンプレートの継承

{% block content %}
{% endblock %}

16. セッションとクッキー

# セッション設定
request.session['username'] = 'user123'

# クッキー設定
response = HttpResponse("Cookie Set")
response.set_cookie('theme', 'dark', max_age=3600)

17. ページネーション

class Paginator:
    def __init__(self, current_page, total_items, items_per_page=10):
        self.current_page = max(1, int(current_page))
        self.total_items = total_items
        self.items_per_page = items_per_page
        self.total_pages = (total_items + items_per_page - 1) // items_per_page
    
    def get_page_range(self):
        start = max(1, self.current_page - 2)
        end = min(self.total_pages, self.current_page + 2) + 1
        return range(start, end)

18. セキュリティ対策

CSRF対策:

# HTML
{% csrf_token %}

# AJAXリクエスト
$.ajax({
    url: '/api/',
    method: 'POST',
    data: {
        csrfmiddlewaretoken: $('input[name="csrfmiddlewaretoken"]').val()
    }
});

タグ: Django Python web-framework ORM database

7月13日 17:02 投稿