[Python]http.server と RangeHTTPServer の違い

TIPS

フロントエンド開発やAPIのテスト、ちょっとしたファイルの受け渡しで、Pythonを使ってローカルサーバーを立ち上げる機会は多いと思います。

最も有名なのは以下のコマンドですよね。

python3 -m http.server 8000

しかし、数万件のデータが入った巨大なZIPファイルや、数百ページある大容量のPDF、あるいは「ダウンロードの再開(レジューム)機能」を伴うシステムの開発をしているとき、この標準サーバーだと「PDFの1ページ目が表示されるまで異常に時間がかかる」「ダウンロードが途中で切れたら最初からやり直しになる」という問題に直面します。

そこで救世主となるのが、外部ライブラリの range-httpserver を使った以下のコマンドです。

python3 -m RangeHTTPServer 8000

見た目やポート番号の指定方法はほぼ同じですが、バックエンドの挙動は全く異なります。今回はこの2つの違いと、開発現場でのスマートな使い分けを解説します!

結論:最大の違いは「HTTP Range リクエスト」への対応

この2つの決定的な違いは、「HTTP Range リクエスト(部分要求)」をサポートしているかどうかです。

  • http.server(標準):ファイルを頭からお尻まで丸ごとドカンと返します。
  • RangeHTTPServer(外部):ファイルの「指定された特定のバイト範囲だけ」を切り取って返せます。

徹底比較表

項目python3 -m http.serverpython3 -m RangeHTTPServer
位置づけPython標準ライブラリ(インストール不要)外部ライブラリ(pip install が必要)
HTTP Range対応❌ 未対応(常に 200 OK を返す)⭕️ 対応(206 Partial Content を返す)
大容量PDFの表示❌ 全ページダウンロードされるまで画面が真っ白⭕️ 1ページ目のデータだけ先読みして即座に表示
ダウンロードの再開❌ 不可(途中で切れたら 0% からやり直し)⭕️ 途中から再開(レジューム)が可能
巨大ZIPの一部抽出❌ 全体を落とさないと中身を見られない⭕️ 必要な箇所のバイトだけ狙い撃ちして読み込める

具体例で見る「Range対応」の凄さ

ブラウザやクライアントアプリが巨大なファイルを扱うとき、サーバーに対して「全部はいらないから、〇〇バイト目から〇〇バイト目までだけ先にちょうだい」というリクエストを送ることがあります。これが HTTP Range リクエスト です。

例1:大容量PDFの「高速ウェブ表示(Fast Web View)」

Adobe Acrobatなどで最適化されたPDF(線形化PDF)は、最初の数ページ分のデータがファイルの先頭に集められています。

  • RangeHTTPServer の場合:ブラウザは「先頭の数KBだけ」をRangeリクエストで要求します。サーバーは 206 Partial Content でその部分だけを即座に返すため、何百ページある重いマニュアルでも、1ページ目が一瞬でパッと表示されます。
  • 標準の http.server の場合:小分けの要求を無視し、ファイル全体(例えば100MB)を丸ごと送りつけようとします。そのため、ダウンロードが完了するまでブラウザの画面は真っ白なまま待たされることになります。

例2:ファイルのダウンロード再開(レジューム機能)

数GBあるファイルをダウンロードしている最中に、ネットワークが一瞬不安定になって接続が切れてしまったケースを考えます。

  • RangeHTTPServer の場合:ブラウザや curl などのクライアントは、「じゃあ、さっき途切れた 500MB目の続きからちょうだい」と再要求できます。サーバーは続きからデータを送れるため、ダウンロードを途中から安全に再開できます。
  • 標準の http.server の場合:続きからの要求を理解できないため、強制的に 0%(最初からやり直し)になります。

開発現場でのスマートな切り分け・アドバイス

これら2つは、開発・検証しているコンテンツやシステムの「データの性質」によって完全に切り分けるのがベストです。

1. 標準の http.server を使うべきシーン

「軽量なテキストや、画像メインのWebサイト・一般的なAPIのテスト」

  • 一般的なHTML / CSS / JavaScript の動作確認
  • 軽量な画像やJSONデータのモックサーバー
  • メリット:環境を汚さず、Pythonさえあれば開発環境、検証環境、あるいは本番サーバーの片隅でも1秒で起動できる手軽さ。

2. RangeHTTPServer を使うべきシーン

「電子書籍(PDF)、大容量アセット、通信の安定性が求められる機能のテスト」

  • カタログやマニュアルなど、重いPDFをブラウザでインライン表示するサイトの開発
  • アプリのアップデート用バイナリや、巨大なゲームアセットのダウンロード機能の実装
  • ネットワークの瞬断を考慮した「レジューム機能」のバックエンド仕様をローカルで再現したいとき
  • メリット:本番環境(nginxやApache、各種オブジェクトストレージ等)の挙動(206ステータス)を、ローカル環境に忠実に再現できる。

まとめ:扱うファイルの「サイズ」で使い分けよう

テキストや画像ベースの一般的なWeb開発であれば、標準の python3 -m http.server で全く不自由しません。

しかし、一転して「メガバイト・ギガバイト単位の巨大ファイル」や「最適化PDF」が関わってきた瞬間に、標準サーバーは開発のボトルネックになります。「バグではないのにPDFが開くのが遅い」「ダウンロード処理のテストが正しく進まない」と悩む前に、

pip install range-httpserver
python3 -m RangeHTTPServer 8000

に切り替える。これを知っておくだけで、インフラ起因の謎の挙動に時間を奪われるリスクを大幅に減らすことができます。ぜひ試してみてください!

コメント

タイトルとURLをコピーしました