HTTPプロトコルの基礎
HTTPはデータ転送形式を定義するアプリケーション層プロトコルです。ソケットサーバーを実装し、ブラウザをクライアントとして動作させることで、以下の基本構造を理解できます:
- リクエストライン/レスポンスライン
- ヘッダーフィールド
- メッセージボディ
主要リクエストヘッダーとボディ
Formデータ送信例
POST /index HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
username=alex&password=123
JSONデータ送信例
POST /api HTTP/1.1
Host: www.example.com
Content-Type: application/json
{"username":"alex","password":123}
Djangoリクエストライフサイクル
- WSGI: リクエストの初期処理
- ミドルウェア: CSRF検証やセッション処理
- ルーティング
- ビュー: ORM/Template処理
- ミドルウェア: レスポンス加工
- WSGI: レスポンス送信
ORM最適化手法
class Department(models.Model):
name = models.CharField(max_length=50)
class Employee(models.Model):
name = models.CharField(max_length=50)
dept = models.ForeignKey(Department, on_delete=models.CASCADE)
N+1問題の解決
# 非効率 (N+1クエリ)
employees = Employee.objects.all()
for emp in employees:
print(emp.name, emp.dept.name)
# 結合解決 (selected_related)
employees = Employee.objects.select_related('dept')
# 分割解決 (prefetch_related)
employees = Employee.objects.prefetch_related('dept')
RESTful API設計原則
- HTTPメソッド: GET/POST/PUT/DELETE
- エンドポイント設計: /resource/{id}
- ステータスコード管理
- バージョニング
ネットワーク基礎
- TCP/UDP: コネクション型 vs コネクションレス
- OSI 7層モデル
- TCPハンドシェイク: 3-way handshake
- ルーター: ネットワーク間接続
- スイッチ: 同一ネットワーク内接続
非同期処理モデル
Twistedフレームワーク
from twisted.web.client import getPage
from twisted.internet import reactor
def process_response(content):
print(f"Received {len(content)} bytes")
getPage(b'https://example.com').addCallback(process_response)
reactor.run()
Redisキュー実装
FIFOキュー
import redis
class RedisQueue:
def __init__(self):
self.conn = redis.Redis()
def enqueue(self, item):
self.conn.lpush('queue', item)
def dequeue(self):
return self.conn.rpop('queue')
並列リクエスト処理
from gevent import monkey; monkey.patch_all()
import gevent
import requests
def fetch_url(url):
response = requests.get(url)
print(response.status_code)
urls = [
'https://example.com/page1',
'https://example.com/page2'
]
jobs = [gevent.spawn(fetch_url, url) for url in urls]
gevent.joinall(jobs)
データ構造変換
def build_tree(nodes, parent=None):
tree = {}
for node in nodes:
if node.get('parent') == parent:
tree[node['name']] = build_tree(nodes, node['name'])
return tree