Pythonにおける「ミドルウェア(middleware)」とは、アプリケーションのリクエストとレスポンスの間に入り込み、処理の流れを制御・変更するソフトウェアの層のことを指します。
これは特にWebアプリケーション開発で頻繁に使われる概念で、フレームワーク(例:Django, Flask, FastAPI)と密接に関係しています。
ミドルウェアの役割とは
ミドルウェアは、アプリケーションの主なロジックとは独立して、共通処理を挿入できる仕組みです。
具体的な役割には以下のようなものがあります。
処理内容 | 説明 |
---|---|
認証・認可 | ユーザーがログインしているか、アクセス権を持っているかのチェック |
ログ出力 | どのリクエストがいつ来たかを記録 |
エラー処理 | 例外が発生したときの共通的なハンドリング |
リクエスト変換 | クライアントからのデータを加工、整形 |
レスポンス追加処理 | ヘッダー追加、データ圧縮、レスポンスのキャッシュ制御など |
CORS制御 | クロスオリジンリクエストの許可・拒否の制御 |
Pythonの代表的なWebフレームワークにおけるミドルウェアの使われ方
Djangoのミドルウェア
Djangoでは、ミドルウェアはクラスとして実装されます。
# myapp/middleware.py
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print("リクエスト前処理")
response = self.get_response(request)
print("レスポンス後処理")
return response
このミドルウェアは、リクエストがビューに届く前後に処理を挿入できます。
Django設定ファイルの MIDDLEWARE
リストに追加すると有効になります。
MIDDLEWARE = [
'myapp.middleware.SimpleMiddleware',
...
]
Flaskのミドルウェア
Flaskには「正式なミドルウェア」という仕組みは存在しませんが、before_request
や after_request
フックを使って同様のことができます。
from flask import Flask, request
app = Flask(__name__)
@app.before_request
def before():
print("リクエスト前の処理")
@app.after_request
def after(response):
print("レスポンス後の処理")
return response
また、WSGIミドルウェアを使って、アプリ自体をラップすることも可能です(後述)。
FastAPIのミドルウェア
FastAPIは @app.middleware("http")
デコレータを使って、より明確にミドルウェアを定義できます。
!pip install fastapi uvicorn
from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI()
@app.middleware("http")
async def log_middleware(request: Request, call_next):
print(f"アクセス:{request.url}")
response = await call_next(request)
print("レスポンス生成完了")
return response
FastAPIでもクラスベースでミドルウェアを定義できます。
WSGIミドルウェアとは?
Python Webアプリケーションは、WSGI(Web Server Gateway Interface) という共通インタフェースに基づいて実装されることが多いです。
WSGIミドルウェアは、アプリケーションを包み込むようにして拡張する関数またはクラスです。
def simple_wsgi_middleware(app):
def wrapper(environ, start_response):
print("WSGI ミドルウェア:リクエスト処理中")
return app(environ, start_response)
return wrapper
# Flaskアプリに適用
app.wsgi_app = simple_wsgi_middleware(app.wsgi_app)
このように、WSGIレベルで共通処理を加えることもできます。
ミドルウェアのメリットと注意点
メリット
- 共通処理を一箇所にまとめられる(コードの重複を防げる)
- アプリケーションのビューやエンドポイントを汚さずにロジックを挿入可能
- テストやデバッグがしやすくなる(リクエストのトレースなど)
注意点
- ミドルウェアの順序が重要(DjangoやFastAPIでは実行順が影響)
- 処理が重くなるとパフォーマンス低下につながる
- 状態管理を間違えると、セキュリティリスクが生じることも(例:認証情報の漏洩)
まとめ

観点 | 説明 |
---|---|
ミドルウェアとは? | リクエストとレスポンスの間に共通処理を挿入する仕組み |
主な用途 | 認証、ログ、エラーハンドリング、CORSなど |
実装スタイル | Djangoではクラス、FastAPIでは関数またはクラス、FlaskではフックやWSGI |
注意点 | 順序と性能に注意。状態や副作用にも気を配る |
以上、Pythonのミドルウェアについてでした。
最後までお読みいただき、ありがとうございました。