Python Web開発入門:WSGI、Djangoインストール、主要フレームワーク比較

シンプルなWebサーバーの実装

以下は、socketモジュールを用いてHTTPリクエストを処理する最小限のWebサーバーの例です。

import socket

sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(5)

conn, addr = sock.accept()
raw_data = conn.recv(1024).decode('utf-8')

path = raw_data.split('\r\n')[0].split(' ')[1]

conn.send(b'HTTP/1.1 200 OK\r\n\r\n')

if path == '/index':
    with open('basic_page.html', 'rb') as f:
        conn.send(f.read())
elif path == '/login':
    conn.send(b'login page')
else:
    conn.send(b'404 Not Found')

conn.close()

wsgiref を使ったWebフレームワーク構築

wsgirefはPython標準ライブラリに含まれるWSGIリファレンス実装で、開発用途に適しています。

よくあるValueError

  • [{'key': 'val'}] → 「期待される2つの値が不足」
  • ['a', 'b', 'c'] → 「値が多すぎる(2つを期待)」
  • 正しくは[('key', 'val')]のようなタプルのリスト

views.py

ビジネスロジックを含む関数(ビュー関数)を定義します。

urls.py

URLパスと対応するビュー関数のマッピングを管理します。

templatesディレクトリ

HTMLテンプレートファイルを格納します。

静的ページ vs 動的ページ

  • 静的ページ:HTML内にハードコードされた内容で変化しない
  • 動的ページ:現在時刻やデータベースから取得したデータをリアルタイムで埋め込む

Jinja2テンプレートエンジン

Jinja2はPython向けの強力なテンプレートエンジンで、HTML内にPython風の構文を埋め込めます。

from jinja2 import Template

def render_user_page(env):
    context = {'name': 'Alice', 'interests': ['coding', 'music', 'hiking']}
    with open('templates/user_profile.html', encoding='utf-8') as f:
        template_str = f.read()
    tmpl = Template(template_str)
    return tmpl.render(profile=context)

対応するHTMLテンプレート:

<p>{{ profile.name }}</p>
<p>{{ profile.interests|join(', ') }}</p>
<p>最初の趣味: {{ profile.interests.0 }}</p>

データベースとの連携

pymysqlを使ってMySQLからデータを取得し、Jinja2でテンプレートに渡す例:

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='Cql123456',
    database='myapp',
    charset='utf8mb4',
    autocommit=True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute("SELECT id, username FROM users")
users = cursor.fetchall()  # [{'id': 1, 'username': 'Alice'}, ...]

Pythonの三大Webフレームワーク

リクエスト処理フロー

クライアント → WSGIサーバ → ルーティング → ビュー関数 → テンプレートレンダリング → レスポンス

フレームワーク比較

  • Django
    • フルスタック。ORM、管理画面、認証など多数の機能を内蔵
    • 内部でwsgirefを使用(開発用)
    • 独自のテンプレートエンジンとルーター
  • Flask
    • マイクロフレームワーク。拡張性重視
    • WSGIサーバとしてWerkzeug、テンプレートにJinja2を採用
    • ルーティングは自前実装
  • Tornado
    • 非同期・ノンブロッキングI/Oを特徴とする
    • WebSocketや長時間接続に適している
    • すべてのコンポーネント(ソケット、ルーティング、テンプレート)を自作

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

注意事項

  • ユーザー名やパスに日本語を含まない
  • Python 3.4〜3.6推奨(特に学習目的ではDjango 1.11系)
  • 1つのPyCharmウィンドウで1つのDjangoプロジェクトのみ実行
  • インストール確認:django-admin --version

コマンドラインでのプロジェクト作成

# プロジェクト作成
django-admin startproject mysite

# アプリケーション作成
python manage.py startapp core

# サーバー起動
python manage.py runserver 127.0.0.1:8080

templatesフォルダは手動で作成し、settings.pyTEMPLATES['DIRS']にパスを追加する必要があります:

'DIRS': [os.path.join(BASE_DIR, 'templates')],

PyCharmでの設定

  • 作成したアプリをINSTALLED_APPSに登録(例:'core.apps.CoreConfig'
  • ポート競合を避けるため、同一ポートでの複数起動は禁止
  • データベース設定はDATABASESで変更可能

Djangoプロジェクトの構成

  • manage.py:管理コマンドのエントリポイント
  • プロジェクト名/settings.py:設定ファイル
  • プロジェクト名/urls.py:ルートURL設定
  • アプリ/migrations/:データベースマイグレーション履歴
  • アプリ/models.py:データモデル定義
  • アプリ/views.py:ビュー関数

Djangoの基本レスポンス関数

初心者がまず覚えるべき3つのレスポンスタイプ:

from django.http import HttpResponse
from django.shortcuts import render, redirect

def text_view(request):
    return HttpResponse("Hello from Django!")

def html_view(request):
    data = {'message': 'Welcome'}
    return render(request, 'home.html', data)

def redirect_view(request):
    return redirect('/home/')  # 内部URL
    # return redirect('https://example.com/')  # 外部URL

Django開発サーバーはファイル変更を監視し自動再起動します。途中保存による一時的なエラーは無視して構いません。

タグ: Django flask Tornado WSGI Jinja2

5月20日 00:33 投稿