ウェブフレームワークとDjangoの基本概念
ソフトウェア開発におけるクライアント/サーバー(C/S)アーキテクチャは、現代のウェブアプリケーション開発の基盤です。HTTPプロトコルとSQL言語の発展により、統一されたインターフェースと標準が確立されました。
HTTPプロトコルの基礎
- HTTPの四大特性
- TCP/IPプロトコルに基づき、アプリケーション層で動作する
- リクエスト/レスポンスモデルに基づく
- ステートレス(状態を保持しない)- cookie、session、tokenなどの解決策
- コネクションレス - WebSocketのような長期接続の必要性
- データ形式
- リクエスト形式: リクエスト行、リクエストヘッダー、リクエストボディ
- レスポンス形式: ステータス行、レスポンスヘッダー、レスポンスボディ
- ステータスコード
数字コードによってHTTPリクエストの結果を表現
純粋Pythonによる簡易Webフレームワークの構築
まず、Pythonの標準機能のみを使用して基本的なWebフレームワークを実装してみましょう。
Djangoの主要コンポーネント
- views.py: ビューハンドラ関数を格納。ビューレイヤーとして機能
- urls.py: URLパターンとビューハンドラの対応関係を定義。ルーティングレイヤー
- templatesディレクトリ: HTMLテンプレートファイルを格納。テンプレートレイヤー
静的ページと動的ページの違い
- 静的ページ: データが固定され、手動で変更が必要
- 動的ページ: データが動的に取得される
- 例1: サーバー側で現在時刻を動的に取得
- 例2: データベースからクエリしたデータを表示
実践課題
- 現在時刻を表示するページの作成
- ユーザーデータ辞書を表示し、テンプレート内で操作可能にする
jinja2テンプレートエンジン
jinja2は、サーバーサイドデータとHTMLページの相互作用を処理するための強力なテンプレートエンジンです。
基本的なテンプレート構文
jinja2構文はPythonの構文に非常に近く、HTML内でサーバーデータを操作できます。
テンプレートのレンダリングプロセス
テンプレートのレンダリングは、サーバー側でHTMLファイルを完全に生成するプロセスです。フロントエンドとは無関係にサーバー側で処理されます。
Pythonの主要Webフレームワーク比較
| フレームワーク | 特徴 | 比較 |
|---|---|---|
| Django | 大規模で多機能、多くの組み込みコンポーネント | 航空母艦のような巨大なフレームワーク |
| Flask | 軽量で最小限、サードパーティコンポーネントに依存 | 軽量兵士のようなフレームワーク |
| Tornado | 非同期・非ブロッキング、ゲームサーバーにも利用可能 | 独自の実装を持つフレームワーク |
Djangoフレームワークの詳細
インストールとプロジェクト作成
- Djangoのインストール確認:
django-admin --version - プロジェクト作成:
django-admin startproject myproject - プロジェクト起動:
cd myproject python manage.py runserver - アプリケーション作成:
python manage.py startapp myapp
Djangoプロジェクト構造
- プロジェクトルート
settings.py: 設定ファイルurls.py: URLルーティング設定manage.py: Djangoプロジェクト管理スクリプト
- アプリケーションディレクトリ
migrations/: データベースマイグレーションファイルadmin.py: Django管理サイト設定models.py: データモデル定義views.py: ビューハンドラ関数templates/: HTMLテンプレートファイル
アプリケーションの登録
作成したアプリケーションは、settings.pyのINSTALLED_APPSに登録する必要があります。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp.apps.MyappConfig',
]
Djangoの基本的なレスポンス方法
HttpResponse
文字列を直接クライアントに返します。
from django.http import HttpResponse
def welcome(request):
return HttpResponse("ようこそDjangoの世界へ!")
render
HTMLテンプレートをレンダリングして返します。テンプレートにコンテキストデータを渡せます。
from django.shortcuts import render
def user_profile(request):
user_data = {'name': '田中太郎', 'email': 'tanaka@example.com'}
return render(request, 'profile.html', {'user': user_data})
redirect
別のURLにリダイレクトします。
from django.shortcuts import redirect
def dashboard(request):
# 内部リダイレクト
return redirect('/home')
def external_redirect(request):
# 外部サイトへのリダイレクト
return redirect('https://www.djangoproject.com')
開発時の注意点
- Djangoはファイル変更を検知すると自動的に再起動します
- コード変更後は手動で再起動することをお勧めします
- 同一ポートで複数のDjangoプロジェクトを同時に実行することはできません