Python Monthly Topics

Python Webツールキットの役割と機能

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

Webツールキットと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からインポート
werkzeugからインポート

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

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

starletteからインポート
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(コマンドライン)サポート
凡例⁠
  • ◯:機能提供
  • △:アドオンで提供
  • +:機能を拡張

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で規格化された、PythonWebアプリケーションと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)

HTTPユーティリティ(Cookie処理⁠ヘッダー処理⁠URLエンコードなど)

Webアプリケーションを作るうえで、CookieHTTPヘッダーURLエンコードなどのHTTP通信に関する決められた処理があります。リクエストやレスポンスの処理と同様に、規格化された決まった処理になります。

ログイン可能なサイトにおいて、CookieやHTTPヘッダーを使ってログインしているユーザーを特定したりします。また、ログイン後にサーバーサイドCookieを付与するといった機能が備わっています。

HTTPユーリリティは規約に則った低レイヤーのやり取りを、Pythonプログラムが扱いやすくしてくれる機能となります。

WerkzeugでSecure属性を有効にし、HttpOnlyにするCookieを設定する例を示します。

def home(request: Request):
    response = Response("Hello, World")
    response.set_cookie("__dummy", "user_name", secure=True, httponly=True)
    return 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サーバーの位置付けを説明しました。Webプロキシーサーバーについては、範囲外としていますので別の情報を参照してください。

まとめ

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

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

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

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

おすすめ記事

記事・ニュース一覧