コンテンツにスキップ

cgi.FieldStorage()に代わるもの

[質問]

昔PythonでCGIを扱っていたころ、cgi.FieldStorage()がフォームから受信したデータを解析してくれました。現代のモダンなWeb技術では、フォームから送られるデータをどんなモジュールやメソッドが処理していますか。

[回答] Gemini

CGIの時代に cgi.FieldStorage() が担っていた役割は、現代のPython Web開発ではWebフレームワーク(Flask, FastAPI, Djangoなど)の内部機能や、それらが利用しているWSGI/ASGIサーバー、および専用のパースライブラリに置き換わっています。

特筆すべき点として、標準ライブラリの cgi モジュールは Python 3.13 で完全に削除されました。 そのため、現代では以下のいずれかの方法でフォームデータを処理するのが一般的です。


1. 主要フレームワークでの処理方法

モダンなフレームワークでは、開発者が生のバイト列を解析する必要はなく、request オブジェクトを介して辞書形式でデータを取り出せます。

フレームワーク 使用されるメソッド / プロパティ 特徴
Flask request.form ImmutableMultiDict型でデータを保持。ファイルは request.files
FastAPI Form(...), File(...) Pydanticによる型定義と自動バリデーションが強力。
Django request.POST フォームクラス(forms.Form)と連携し、クリーンアップまで行う。

2. 内部で動いている「解析の主役」

cgi.FieldStorage() の直接の後継となる、低レイヤーのライブラリやメソッドは以下の通りです。

Werkzeug (Flaskの基盤)

Flaskなどのバックエンドで動いているライブラリです。

  • werkzeug.formparser.FormDataParser: マルチパート(ファイルアップロード)やURLエンコードされたフォームデータを解析する実体です。

python-multipart (FastAPI等の基盤)

FastAPIやStarletteが採用している、非常に高速なストリーミングパーサーです。

  • 大きなファイルをアップロードする際、メモリを節約しながら逐次処理する能力に長けています。

urllib.parse (標準ライブラリ)

GETリクエストのクエリパラメータなど、シンプルなURLエンコードデータの解析には現在もこれが使われます。

  • urllib.parse.parse_qs(): クエリ文字列を辞書に変換します。

3. CGI時代との決定的な違い

現代の技術では、単にデータを「受け取る」だけでなく、以下の処理をセットで行うのが「モダン」とされます。

  1. バリデーション: データが数値か、メールアドレス形式かなどを自動チェック。
  2. 型変換: 受信した文字列を自動で intdatetime オブジェクトに変換(特にFastAPI)。
  3. セキュリティ: CSRF(サイト間リクエスト偽造)対策がフレームワークレベルで組み込まれている。

注意: もし現在も古いCGIスクリプトを保守しており、cgi モジュール削除への対策が必要な場合は、PyPIで公開されている multipart ライブラリが cgi.FieldStorage の代替として公式ドキュメント等でも推奨されています。


次の一歩として、具体的なフレームワーク(FlaskやFastAPIなど)での実装例を作成しましょうか?

Flaskでフォームデータを受け取る基本コード この動画では、Flaskを使ってHTMLフォームからデータを受け取り、サーバー側で処理する具体的な流れを解説しています。