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

この記事では、Webツールキットに着目して役割や機能を紹介します。Webツールキットの存在や役割を知ることで、Webフレームワークの特徴を理解しやすくなり、裏側の仕組みを知るきっかけになると思います。
Webツールキットとは
「Webツールキット
Webフレームワークとの違い
Webフレームワークは、WebサービスやWebシステム、さらには、WebバックエンドのAPIサーバを構築する際に用いられるものです。PythonのWebフレームワークの代表格としては、DjangoやFlask、FastAPI、Pyramidなどがあります。
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という機能の紹介があります。

ここでは、Flaskが使っているWebツールキットであるwerkzeug
からsecurity
機能をインポートしています。
FastAPI エラーハンドリングには、エラーハンドリングの紹介があります。

ここでは、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/ |
◯ | ◯ | ◯ | ◯ | |||
リクエスト・ |
◯ | ◯ | ◯ | ◯ | |||
ルーティング機能 | ◯ | + | ◯ | + | ◯ | + | ◯ |
テンプレートエンジン統合 | ◯ | ◯ | ◯ | ||||
HTTPヘッダー・ |
◯ | ◯ | ◯ | ◯ | |||
セッション管理 | ◯ | ◯ | ◯ | ||||
フォームデータのパース | ◯ | ◯ | ◯ | ◯ | |||
認証・ |
◯ | ◯ | ◯ | ◯ | |||
データ検証 |
△ | △ | ◯ | ◯ | |||
設定管理 | △ | ◯ | △ | ◯ | |||
CLI |
◯ | ◯ | △ | ◯ |
- 凡例:
-
- ◯:機能提供
- △:アドオンで提供
- +:機能を拡張
Webツールキットが持つ機能
ここではWebツールキットがどのような機能を持っているかを見ていきます。
WSGI/
リクエスト・
ルーティング機能もWebツールキットで機能を提供していますが、Webフレームワーク側で機能拡張していることがあります。
これらにより、Webフレームワークは、低レイヤーの部分を意識せず、Webの振る舞いや作りたいものに集中できるようにフレームワーク化をしています。
Webツールキットが持っていない機能
セッション管理や認証・
他にも、データ検証
Webツールキットの機能説明
ここでは、Webツールキットが持つ主な機能の中身を見ていきます。
WSGI/ASGIユーティリティ
まず、WSGIとASGIについて説明します。
WSGIは、PEP 3333 – Python Web Server Gateway Interface v1.
ASGIは、WSGIの非同期版の位置づけになります。同期と非同期をサポートし、WSGIの後継を目指したものになります。
PEPにはなっておらず、独自にインターフェースなどのスペックが公開されています。なおASGIに対応したサーバーは、UvicornやHypercornなどがあります。
WSGIにしても、ASGIにしても、インターフェースが決まっています。とはいえ、それなりに実装しなければいけないことがあります。WebサーバーでWebシステムを公開するためには必要な機能となりますので、この部分を担ってくれるツールやライブラリがあることは重要です。
リクエストとレスポンスの処理
Webアプリケーションは、HTTP通信やWebSocketを通じて、リクエストを受け取って、レスポンスを返します。これらは規約に則った通信を行うことで、クライアント
リクエストはクライアントからWebアプリケーションへの要求です。リクエストにはGETやPOSTといったメソッドがあり、Webアプリケーションへ指示を行います。この指示を、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アプリケーションを作るうえで、Cookie
やHTTPヘッダー
、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.ImmutableMultiDict
という専用のオブジェクトが返ってきます。
def home(request: Request):
form = request.form # ImmutableMultiDictオブジェクト
name = form.get("name", "名前なし") # 辞書のようにgetメソッドでデータを取得
return f"{name} さん、こんにちは"
ルーティング
URLのPathから、どのような機能を提供するかを決めるのがルーティングです。
Webフレームワークにおいては、関数デコレータでPathを登録するものや、urls.
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ツールキットの役割と機能を説明しました。Werkzeug、WebOb、Starletteという3つの主要なツールキットを紹介し、それぞれがFlask、Pyramid、FastAPIといったフレームワークの基盤となっていることを見てきました。
Webツールキットは、WSGI/
これらの知識は、Webフレームワークの深い理解の助けになりますし、特殊な要件がある場合に最適なソリューションを見つける助けにもなります。この機会に、普段使っているフレームワークのドキュメントを再確認し、どのツールキットが使われているか、どのような機能が利用可能かを調べてみることをお勧めします。
Web開発の始めたばかりの方は、まずはフレームワークの基本を学びつつ、時折その裏側で動いているツールキットの存在を意識してみてください。それが将来、より深い理解と柔軟な問題解決につながるでしょう。