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()
}
});