シンプルな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.pyのTEMPLATES['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開発サーバーはファイル変更を監視し自動再起動します。途中保存による一時的なエラーは無視して構いません。