2025 年 4 月: Python Web ツールキットの役割と機能

寺田 学@terapyonです。2025 年 4 月の「Python Monthly Topics」は、Python Web ツールキットの役割と機能を紹介します。

Web ツールキットと Web フレームワーク

Web ツールキットと Web フレームワークの概要を見ていきます。 Web ツールキットは、Web フレームワークの機能の一部として動作することが多いものです。

Web フレームワークと Web ツールキット

この記事では、Web ツールキットに着目して役割や機能を紹介します。 Web ツールキットの存在や役割を知ることで、Web フレームワークの特徴を理解しやすくなり、裏側の仕組みを知るきっかけになると思います。

Web ツールキットとは

「Web ツールキット (Toolkit)」は、ライブラリやコンポーネントの集合体として機能を提供するという側面に重点が置かれているものです。 それに対し、「Web フレームワーク (Framework)」は、データ管理やアプリケーション実装を助けるなど、より広範な機能と構造化されたアプローチです。ツールキットはライブラリまたはライブラリ群と言われることもあります。

Web フレームワークとの違い

Web フレームワークは、Web サービスや Web システム、さらには、Web バックエンドの API サーバを構築する際に用いられるものです。 Python の Web フレームワークの代表格としては、Django や Flask、FastAPI、Pyramid などがあります。

Web フレームワークには、認証・認可機能、テンプレート統合機能、データベースとの接続管理などさまざまなものが準備されています。 Web システムなどを作る場合にはいずれかのフレームワークを採用する場面が多いかと思っています。

Web ツールキットを意識する場面

Web フレームワークを使っていても、Web ツールキットを直接使うことは少ないと思います。 ただ、以下のような場面や用途では Web ツールキットを意識することになります。

  • 依存関係を減らしてシンプルな技術スタックで Web システムを作りたい場合

  • Web フレームワークを作る場合

  • Web フレームワークを使っているが処理をカスタマイズしたい場合

  • Web フレームワークの公式ドキュメント中で Web ツールキット名が言及されている場合

依存関係を減らしてシンプルな技術スタックを使いたい場面とは、IoT 機器のようにメモリなどのリソースが限られている場面で、内部で Web サーバーを動かしたい場合などが想定されます。 このような場面で、フレームワークは不要で最小限のエンドポイントを作りたい場合には、シンプルな構成にできる場合があります。

次に、Web フレームワークを作る場合ですが、既存のものでは用途が向かない場合などで、自分自身のオリジナルフレームワークを作る場合に使うことができます。 技術的な探究心で Web フレームワークを作る場合には、Web ツールキットから独自実装するということも考えられます。

Web フレームワークが持たない機能や、特殊な機能を実装する場合に、Web フレームワークだけでなくその内部にある Web ツールキットを意識することになります。 Web ツールキットがどこまでの役割をしていて、Web フレームワークがどのように実装しているのかを深く知っていく必要があります。

Web フレームワークの公式ドキュメントを読んでいると、詳しくは別のドキュメントを参照して欲しいと書かれていることがあります。 また、暗黙的に Web ツールキットのライブラリがインポートされているコードを目にすることもあります。

Web フレームワークの公式ドキュメントに Web ツールキットが登場する 2 つの例を紹介します。

Flask の公式ドキュメント チュートリアル Views には、Blueprint という機能の紹介があります。

werkzeugからインポート

ここでは、Flask が使っている Web ツールキットである werkzeug から security 機能をインポートしています。

FastAPI エラーハンドリング には、エラーハンドリングの紹介があります。

starletteからインポート

ここでは、FastAPI が使っている Web ツールキットである starlette から exceptions 機能をインポートしています。 FastAPI では、ドキュメントの随所に starlette のドキュメントへのリンクや、機能を使っていることが示されています。

Web ツールキットの紹介

今回は 3 つの Python の Web ツールキットを紹介します。

それぞれ、著名な Web フレームワークで使われています。

なお、Django はツールキットを使っていません。Django 自身ですべての機能を提供しているフルスタックなフレームワークになっています。 Django のように、ツールキットの部分も包含している Web フレームワークも存在します。

以下に、Web ツールキットと Web フレームワークで主に提供している機能を整理しています。

機能

Werkzeug

Flask

WebOb

Pyramid

Starlette

FastAPI

Django

WSGI/ASGI ユーティリティ

リクエスト・レスポンスオブジェクト

ルーティング機能

テンプレートエンジン統合

HTTP ヘッダー・クッキー操作

セッション管理

フォームデータのパース

認証・認可(セキュリティ)

データ検証(バリデーション)

設定管理

CLI(コマンドライン)サポート

凡例:

  • ◯: 機能提供

  • △: アドオンで提供

  • +: 機能を拡張

メモ: 編集者さんへ、表の線の太さを変更して区分けを明確にしたいです。 参照: https://docs.google.com/spreadsheets/d/199E_h61G7M9vLgUQG010eC4-qVLeQ-YZ0zd8WZYjmaA/edit?gid=2132535814#gid=2132535814

Web ツールキットが持つ機能

ここでは Web ツールキットがどのような機能を持っているかを見ていきます。

WSGI/ASGI ユーティリティとしての機能は、Web ツールキットが必ず持つ機能と考えてよいでしょう。 Python の Web サーバーのインターフェースである、WSGI や ASGI に対応させるのは基本機能となり、Web ツールキット側が担います。

リクエスト・レスポンスオブジェクト、HTTP ヘッダー・クッキー操作、フォームデータのパースも Web ツールキットが提供しています。 これらの機能は、Web を作る上での基本的な機能となり、HTTP 通信部分など低レイヤーの機能になります。

ルーティング機能も Web ツールキットで機能を提供していますが、Web フレームワーク側で機能拡張していることがあります。

これらにより、Web フレームワークは、低レイヤーの部分を意識せず、Web の振る舞いや作りたいものに集中できるようにフレームワーク化をしています。

Web ツールキットが持っていない機能

セッション管理や認証・認可(セキュリティ)といった分野は、Web ツールキットではなく、Web フレームワークが機能を担っています。 また、テンプレートとの統合機能についても、Web ツールキットが担う範囲ではないと言えるでしょう。

他にも、データ検証(バリデーション)、設定管理、CLI(コマンドライン)サポートといった、Web フレームワークごとに対応していたり、拡張機能として提供されているものについても、Web ツールキットの役割ではないと言え、Web フレームワークごとに使い方や設定方法が違う部分となります。

Web ツールキットの機能説明

ここでは、Web ツールキットが持つ主な機能の中身を見ていきます。

WSGI/ASGI ユーティリティ

まず、WSGI と ASGI について説明します。

WSGI は、PEP 3333 – Python Web Server Gateway Interface v1.0.1 で規格化された、Python Web アプリケーションと Web サーバーのインターフェース規格です。 統一の規格があるため、規格に沿った Python アプリケーションを作ることで、さまざまな Web サーバー上で動作します。 ここでいう、Web サーバーとは、GunicornuWSGIWaitress などをいいます。 これらの Web サーバーは WSGI に対応しているアプリケーションを Web サーバーとして起動して動作させることができます。

ASGI は、WSGI の非同期版の位置づけになります。 同期と非同期をサポートし、WSGI の後継を目指したものになります。

PEP にはなっておらず、独自にインターフェースなどのスペックが公開されています。 なお ASGI に対応したサーバーは、UvicornHypercorn などがあります。

WSGI にしても、ASGI にしても、インターフェースが決まっています。 とはいえ、それなりに実装しなければいけないことがあります。 Web サーバーで Web システムを公開するためには必要な機能となりますので、この部分を担ってくれるツールやライブラリがあることは重要です。

リクエストとレスポンスの処理

Web アプリケーションは、HTTP 通信や WebSocket を通じて、リクエストを受け取って、レスポンスを返します。 これらは規約に則った通信を行うことで、クライアント(Web ブラウザなど)が処理を行います。

リクエストはクライアントから Web アプリケーションへの要求です。リクエストには GET や POST といったメソッドがあり、Web アプリケーションへ指示を行います。 この指示を、Python プログラムが受取り処理を行うことになります。

レスポンスは Web アプリケーションから、クライアントに返すものになります。 レスポンスには、ステータスコード(200 や 400 などの数値)やデータとして HTML テキストや JSON データを返します。 Python のコードやテンプレートから適切なレスポンスを返すことで、Web ブラウザなどのクライアントは適切に表示などの処理をしてくれます。

これらのリクエストやレスポンスの低レイヤーを意識しなくても、Python のオブジェクトで受け渡しができるようにしてくれることが期待する機能となります。

Werkzeug のリクエストとレスポンスの扱い例を示します。

from werkzeug.wrappers import Request, Response

def application(environ, start_response):
    request = Request(environ)  # リクエストオブジェクト
    method = request.method  # リクエストメソッドを取得
    text = f"あなたは、 {method} メソッドでアクセスしています!"
    response = Response(text, mimetype='text/plain')  # レスポンスオブジェクトを作る
    return response(environ, start_response)

フォームデータのパース

ログインや Web フォームでデータを受け取る際に、POST リクエストのデータをパースして Python のオブジェクトに変換します。 フォームのパースを適切に行い、Python のオブジェクトとして受け取ることで、次の処理をやりやすくしてくれます。

フォームのデータを適切に扱うことで、データのバリデーションの機能が作りやすくなってきます。

Werkzeug のフォームデータの取得の例を示します。 Werkzeug では、 request.form にフォームをパースした ImmutableMultiDict という専用のオブジェクトが返ってきます。

def home(request: Request):
    form = request.form  # ImmutableMultiDictオブジェクト
    name = form.get("name", "名前なし")  # 辞書のようにgetメソッドでデータを取得
    return f"{name} さん、こんにちは"

ルーティング

URL の Path から、どのような機能を提供するかを決めるのがルーティングです。

Web フレームワークにおいては、関数デコレータで Path を登録するものや、urls.py のようなモジュールで関数やクラスとのマッピングを行うものもあります。 これらの基盤になっているのが Web ツールキットのルーティング機能です。

Web アプリとして、リクエストを受け取ったときに、どの関数やクラスを呼び出して機能提供をするのかを決める重要な部分となります。

Flask / Werkzeug の例

Flask と Werkzeug のルーティングの指定方法比較します。

Flask においては、以下のようにルーティングを設定します。

@app.route('/')
def home():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

それを支える Web ツールキットの Werkzeug では以下のように設定します。

from werkzeug.routing import Map

def home(request: Request):
    return Response("Index Page")


def hello(request: Request):
    return Response("Hello, World")

url_map = Map([
    Rule('/', endpoint=home),
    Rule('/hello', endpoint=hello)
])

Flask では、ルーティングをデコレータを使って簡単に設定できるように工夫をしています。 これは、Flask でデコレータを使って指定されたものを、内部的に Werkzeug の Map に置き換えています。

FastAPI / Starlette の例

FastAPI では、デコレータでルーティングの設定を行えます。

@router.get("/")
async def home():
    return [{"text": "Index Page"}]

@router.get("/hello")
async def hello():
    return [{"text": "Hello, World"}]

Starlette では、以下のように設定します。

async def home(request):
    return PlainTextResponse("Index Page")

async def hello(request):
    return PlainTextResponse("Hello, World")


routes = [
    Route("/", endpoint=home),
    Route("/hello", endpoint=hello),
]

FastAPI でも、Flask 同様にデコレータでルーティングを設定できるようになっています。

Web アプリケーションの公開

Python でアプリケーションを作った場合に、複数のツールを使って公開します。 以下には、公開に必要な要素の構成を図示しています。

Web フレームワークの周辺技術

公開には「Web サーバー」や「Web プロキシーサーバー」など周辺の技術を使います。 本記事では、Web ツールキットを解説し、Web サーバーの位置付けを説明しました。 Web プロキシーサーバーについては、範囲外としていますので別の情報を参照してください。

今回登場したツールや規格の日本語の読み方

普段、日本語で読み書き、会話をしている身としては、それぞれのツールの発音や読み方を覚えたほうが、お互いの会話の中でわかりやすくなると感じています。 今回、さまざまなツールやライブラリ、規格などを紹介したので、日本語でよく使われているカタカナ表記や読み方を紹介したいと思います。 ただ、カタカナで表現するのが難しいものもあるので、ここに書いた読み方は一例だと思ってください。

ツール/規格名

日本語での読み方

WSGI

ウィズギー

ASGI

アズギー

Django

ジャンゴ

Werkzeug

ヴェルクツォイグ

Flask

フラスク

WebOb

ウェブオブ

Pyramid

ピラミッド

Starlette

スターレット

FastAPI

ファストエーピーアイ

Gunicorn

ジーユニコーン

uWSGI

ユーウィズギー

Waitress

ウェイトレス

Uvicorn

ユビコーン

Hypercorn

ハイパーコーン

まとめ

今回は、Web ツールキットの役割と機能を説明しました。Werkzeug、WebOb、Starlette という 3 つの主要なツールキットを紹介し、それぞれが Flask、Pyramid、FastAPI といったフレームワークの基盤となっていることを見てきました。

Web ツールキットは、WSGI/ASGI インターフェース、リクエスト・レスポンス処理、HTTP ヘッダー・Cookie 操作、フォームデータのパースなど、Web アプリケーションの基盤となる機能を提供しています。これらの低レイヤーの機能を理解することで、フレームワークのカスタマイズやトラブルシューティング能力が向上し、より効率的な開発が可能になります。

これらの知識は、Web フレームワークの深い理解の助けになりますし、特殊な要件がある場合に最適なソリューションを見つける助けにもなります。この機会に、普段使っているフレームワークのドキュメントを再確認し、どのツールキットが使われているか、どのような機能が利用可能かを調べてみることをお勧めします。

Web 開発の始めたばかりの方は、まずはフレームワークの基本を学びつつ、時折その裏側で動いているツールキットの存在を意識してみてください。それが将来、より深い理解と柔軟な問題解決につながるでしょう。