Bottleとは?Pythonの軽量マイクロフレームワークを特徴・使い方・デプロイまで徹底解説

Bottle とは:概要と成り立ち

Bottle は Python 用の軽量なマイクロウェブフレームワークです。単一のファイル(通常は bottle.py)だけで構成され、導入が容易であること、最小限の依存関係で動作すること、シンプルな API を持つことを特徴とします。元々は Marcel Hellkamp 氏が 2009 年に作成し、その後コミュニティで保守・発展してきました。ライセンスは MIT 系で、商用・非商用を問わず自由に利用できます。

設計思想とターゲットユースケース

Bottle の設計思想は「シンプルさ」と「最小構成」です。フルスタックの機能すべてを含めず、ルーティング、リクエスト/レスポンス、テンプレート、静的ファイルの配信、プラグイン・フック機構など、Web アプリを作るための基本要素をコンパクトに提供します。そのため、次のような用途に適しています。

  • 小規模な Web サービスやプロトタイプの構築
  • 教育目的やチュートリアル(フレームワークの学習が容易)
  • マイクロサービスや API エンドポイント(軽量なため起動が速い)
  • 組み込み用途やスクリプトからの簡易な HTTP インターフェース公開

主な特徴

  • 単一ファイルで配布:ソース一式をプロジェクトにそのまま置くだけで使える。
  • シンプルなルーティング:デコレータや関数で HTTP メソッドやパスを簡単に定義。
  • 組み込みテンプレートエンジン:SimpleTemplate(STPL)を提供。必要に応じて他テンプレートエンジンも利用可能。
  • リクエスト/レスポンス API:request、response オブジェクトを通じてヘッダ、クッキー、フォームデータ、JSON 等にアクセス。
  • プラグイン機構:データベース接続や認証などをプラグインで追加可能。
  • WSGI 準拠:任意の WSGI サーバ(Gunicorn、uWSGI、mod_wsgi など)で動作。開発用の軽量なサーバも内蔵。

ルーティングとハンドラの書き方

Bottle の基本はルーティングです。デコレータを使って URL パスに関数を結びつけます。たとえば、"/" に対する GET ハンドラを定義する例は非常に簡潔です。

from bottle import route, run

@route('/')
def index():
    return 'Hello, Bottle!'

run(host='localhost', port=8080)

動的なパスパラメータやクエリ文字列、HTTP メソッド別ルート(GET/POST 等)も簡単に指定できます。ルーティングは軽量で直感的なため、初学者にも親しみやすい設計です。

テンプレートとビュー

Bottle には SimpleTemplate(STPL)という組み込みテンプレートエンジンがあり、Python 式をテンプレート内で直接使うことができます。テンプレートはファイルまたは文字列から読み込め、レンダリング時に変数を渡します。

注意点として、テンプレートエンジンのデフォルトの挙動(エスケープの有無など)はフレームワークやバージョンによって異なる場合があるため、XSS 対策としては出力内容の適切なエスケープや、信頼できない入力のサニタイズを必ず行ってください。また、必要に応じて Jinja2 などの外部テンプレートエンジンに差し替えて使うことも可能です。

プラグイン/拡張性

Bottle 自体は最小限のコアに留められているため、データベースや認証、セッション管理などはプラグインや外部ライブラリで補うのが一般的です。Bottle のプラグイン API を利用すると、ハンドラに対する自動的な依存注入(例:DB 接続を引数として渡す)やリクエストライフサイクルへのフックが可能です。

  • データベース用プラグイン(SQLite、SQLAlchemy、その他 DB-API 対応)
  • セッション/認証用の拡張
  • テンプレートエンジンの入れ替え

デプロイと運用

Bottle は WSGI 準拠なので、任意の WSGI サーバ上で運用できます。本番では組み込みサーバではなく Gunicorn、uWSGI、mod_wsgi、Waitress などの成熟した WSGI サーバを使用し、Nginx などをリバースプロキシ/静的ファイル配信に使うのが一般的です。

軽量さゆえにコンテナ化(Docker)やサーバレス的な小規模配置にも向いています。複数のプロセス/ワーカーでのスケールは WSGI サーバ側に委ねられます。

セキュリティ上の注意点

軽量フレームワークであることは便利ですが、安全性は設計や実装に依存します。主な注意点は次のとおりです。

  • テンプレートや出力のエスケープ:デフォルトの挙動を確認し、XSS 対策を行う。
  • 入力のバリデーション/サニタイズ:SQL インジェクションやコマンドインジェクションを防ぐ。
  • CSRF 対策:フォーム送信等を扱う場合は CSRF トークン等を導入する。
  • セッション管理とクッキーの安全設定:Secure、HttpOnly、SameSite 等の属性を適切に設定する。

パフォーマンスとスケーラビリティ

Bottle 自体は非常に軽量でオーバーヘッドが少ない一方、シングルスレッド/シングルプロセスの環境では同時リクエスト処理能力に限界があります。本番では WSGI サーバでワーカー数を増やす、ロードバランサを配置する、非同期処理が必要な場合は別プロセスやキュー(Celery、RQ 等)を用いるなど、設計面でスケーリング戦略を採る必要があります。

Flask など他フレームワークとの比較

同じくマイクロフレームワークとしてよく比較される Flask と比べると、両者にはいくつかの違いがあります。

  • 配布形態:Bottle は単一ファイルで配布される点が特徴的。Flask はパッケージ形式。
  • エコシステム:Flask の方がプラグイン・拡張のエコシステムが豊富で、公式・非公式ドキュメントやチュートリアルも多い。
  • 学習コスト:どちらも学びやすいが、Bottle はさらにミニマルなので入門には向いている。
  • 設計方針:Flask は拡張を前提にしており、より多様な実運用要件に応える拡張が充実している。

要するに、小さくシンプルなアプリや学習目的には Bottle、拡張性や大規模運用を見越すなら Flask(や Django)を選ぶのが一般的です。

実際の開発での使いどころとベストプラクティス

Bottle を使うときに押さえておきたい実践的なポイントを挙げます。

  • プロジェクト構造を整える:単一ファイル運用は手軽だが、機能拡張を見越すならモジュール分割やパッケージ化を考える。
  • 設定管理:環境毎の設定(開発/本番)を分け、シークレット情報は環境変数や Vault で管理する。
  • テストの導入:ユニットテストや統合テストを用意して REST API の挙動を確かめる。
  • 適切なロギングと監視:本番ではアクセスログ、エラーログ、メトリクスの収集を設定する。
  • 外部ライブラリ選定:テンプレートやDB用ライブラリは成熟したものを選ぶ(例:SQLAlchemy など)。

簡単なサンプル(参考)

シンプルな API を作る例を示します。以下は GET と POST を処理する基本形です。

from bottle import route, run, request, response

@route('/echo', method='POST')
def echo():
    data = request.json or {}
    response.content_type = 'application/json'
    return {'received': data}

run(host='0.0.0.0', port=8080, debug=True)

このように短いコードで RESTful なエンドポイントを作ることができます。

まとめ:いつ Bottle を選ぶか

Bottle は「素早く、簡潔に、挙動が分かりやすい」ことを重視する場面で威力を発揮します。小規模サービス、プロトタイプ、学習、組み込み用途などでは特に有効です。ただし、長期的に機能が増えることや大規模なトラフィックを想定する場合は、拡張性やエコシステムを考慮して Flask や Django、あるいは ASGI ベースのフレームワークを検討した方が良いこともあります。

参考文献