Web開発とネットワークの面接準備ガイド

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リクエストライフサイクル

  1. WSGI: リクエストの初期処理
  2. ミドルウェア: CSRF検証やセッション処理
  3. ルーティング
  4. ビュー: ORM/Template処理
  5. ミドルウェア: レスポンス加工
  6. 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

タグ: HTTP Django ORM restful TCP/IP

7月7日 21:05 投稿