1. Bottleについて

BottleはPython の小さなWebFrameworkです。PythonのWebFrameworkとしては、FlaskやDjangoが有名です。Flaskは比較的軽量なWebFrameworkとして有名ですが、BottleはFlaskよりも更に小さいWebFrameworkです。

とても軽量な代わりに多人数からの同時アクセスを裁けないというデメリットがありますので、大量同時アクセス処理を必要としない小規模や開発環境での一時利用がその用途となります。

今回利用したケースではできるだけ軽量でインストールプログラムの少ないものを求めていたため、Bottleを利用しています。

2. Framework の比較

先にも記載したように、一般的な用途であれば、FlaskやDjangoが有名でサポート情報も見つかりやすい為、それらを採用する事をお勧めします。非力なマシンでの稼働で、アクセスの少ない用途等の場合でのみBottleを検討してください。

Framework名 メリット デメリット
Django フルスタックで柔軟性が高い 必要なリソース量が多い
Flask 軽量、高速処理 ディレクトリ構造は決まっている
Bottle 導入が容易、軽量 同時接続処理に難があり、テスト環境等用途は限られる

3. 利用方法

3-1. 起動方法

起動方法はとても簡単で、pipコマンドでインストールして、作成したpythonファイルを実行するだけである。起動コマンドは、以下。

pip install bottle

最小限であれば、以下で利用できる。移管のファイルをsample.pyとして保存し、

from bottle import route, run, template

@route('/hello/')
def index(name):
    return template('Hello {{name}}!', name=name)

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

以下のコマンドを実行し、ブラウザからlocalhost:8080へアクセスすれば利用できる。

[Windows]
python .\sample.py

[Linux]
python ./sample.py

3-2. 利用例

@route

@route ディレクティブを付与する事で、ルートディレクトリ配下のアクセスパスを指定することができる。引数を渡す事もできる。
# /testへアクセスした場合。
@route('/test/')
def test():
    return template('this is test page. you send key {{item}}', item=item)

#ドキュメントルートへのアクセス
@route('/')
def indexpage():
    return template('this is index page.')

アクセスメソッドを基に振り分ける

routeディレクティブにmethodを指定すれば、該当のアクセスの場合だけ処理する関数も作成できます。但し指定できるディレクティブは1関数辺り1つのみです。以下はオプションヘッダを要求された場合に、空白内容で応答する関数です。

@route('', method=['OPTIONS'])
def response_for_options(**kwargs):
    return {}

画像ファイル等、静的ファイルを返したい場合

static_file 関数を利用する事で画像ファイルを返すことができます。

@app.route('/favicon.ico')
def favcon():
    return static_file('favicon.ico', root='.\static')

POSTの利用

POSTデータを取り出すには、以下の様にします。以下の例ではPOSTデータとしてidとpasswordを受け取っています。

@app.route('/get_images', method=['POST'])
def get_images_path():
    payload = json.load(request.body)
    id = payload["id"]
    password = payload["password"]

4. その他

bottleはシンプルな作りの為、ドキュメントルートへアクセスしたらFTPでファイルを取得したり、Seleniumと組み合わせてサイトをクロールした結果を返す事も可能であった。簡易的なSeleniumツールのフロントエンドとして利用する価値は十分にあると感じました。但しSSLへの対応は単体で行う事が難しい為、SSLを利用する場合はnginx/lets encript/flask等の組み合わせで対応する方が良いでしょう。

コメントを残す

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)