Bottle

提供: ArchWiki
2017年10月20日 (金) 23:29時点におけるKusakata (トーク | 投稿記録)による版 (カテゴリ変更)
ナビゲーションに移動 検索に移動

Bottle: Python Web Framework より:

Bottle は高速・シンプル・軽量な Python の WSGI ウェブマイクロフレームワークです。シングルファイルモジュールとして配布されており Python の標準ライブラリ以外には何も依存していません。

機能

  • ルーティング:
リクエストは関数の呼び出しにマッピングされ簡単に動的な URL を使うことができます。
  • テンプレート:
Pythonic な高速テンプレートエンジンが組み込まれており mako, jinja2, cheetah テンプレートをサポートしています。
  • ユーティリティ:
フォームデータ、ファイルのアップロード、cookie、ヘッダーなどの HTTP 関連のメタデータに簡単にアクセスできます。
  • サーバー:
開発用の HTTP サーバーが組み込まれており paste, fapws3, bjoern, Google App Engine, cherrypy などの WSGI 対応 HTTP サーバーをサポート。

インストール

python-bottle (Python 3 用) または python2-bottle (Python 2 用) をインストールしてください。

Hello World

以下は Hello World と表示するサーバーの例です:

from bottle import route, run
 
@route('/:name')
def index(name='World'):
    return 'Hello %s!' % name

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

Bottle を起動するときは Python を使います:

python server.py

以下のように表示されます:

Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Use Ctrl-C to quit.

FastCGI

(Lighttpdnginx などから) Bottle を扱うときは FastCGI が便利です。ただし Bottle をフックするものが必要です。python-flup[リンク切れ: パッケージが存在しません] パッケージの FLUP を使用する Hello World アプリケーションの例:

from bottle import route, run, FlupFCGIServer
 
@route('/:name')
def index(name='World'):
    return 'Hello %s!' % name

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

詳しくは こちら を読んでください。

リロード

デフォルトでは、Bottle ではファイルのリロードができませんが、新しいサーバーを起動して切り替えることでリロードすることができます:

from bottle import route, run
 
@route('/:name')
def index(name='World'):
    return 'Hello %s!' % name

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

リロード間隔を設定するには (デフォルトでは1秒です):

run(host='localhost', port=8080, reloader=True, interval=0.5)

トラブルシューティング

アプリケーションが外部から見れない

Bottle を直接ウェブサーバーとして使用する場合、'localhost' 以外からアクセスできるようにホストする IP アドレスを設定する必要があります:

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

ファイルを変更しても Bottle が自動的にリロードされない

Bottle はインポートされたファイルを監視してアプリケーションに変更がないか確認しています。リロードしたいアプリケーションモジュールをインポートしてください:

import myapp

上記のコマンドが使えない場合:

@route('/:name')
def index(name='World'):
    import myapp
    return myapp.init(name)