[Dd]enzow(ill)? with DB and Python

DBとか資格とかPythonとかの話をつらつらと

Pythonで一番小さいWEBフレームワークbottle.py その1

BottleというWEBアプリケーションフレームワークをご存知でしょうか。 DjangoやFlask等さまざまなWEBアプリケーションフレームワークがある中で、Bottleはもっとも軽量なフレームワークです。

1ファイル(bottle.py)で構成されているにもかかわらず、以下のようにWEBアプリケーションに必要な機能が含まれています。

  • Routing
    • 動的なルーティング含め、実行される関数とのマッピングを提供
  • Templates
    • 組み込みのテンプレートエンジンを搭載し、さらにJinja2等のテンプレートもサポート
  • Utilities
    • POSTされたFormデータやCookie、FileのUploadに関する機能を提供
  • Server
    • 組み込みのHTTPサーバを搭載し、開発時の動作確認が容易
    • その他のサーバとの連携も可能

これらの機能以外にも、Pluginを導入すればさまざまな 機能が利用可能になります。

インストール

pipでインストール可能です。

(bottle_sample) > pip install bottle
Collecting bottle
  Downloading bottle-0.12.13.tar.gz (70kB)
    100% |████████████████████████████████| 71kB 61kB/s
Building wheels for collected packages: bottle
  Running setup.py bdist_wheel for bottle ... done
  Stored in directory: C:\Users\debzow\AppData\Local\pip\Cache\wheels\49\cf\37\132916b926fae01d6e27d94c0018e3ad07452ec3760e24a36a
Successfully built bottle
Installing collected packages: bottle
Successfully installed bottle-0.12.13

また、単一ファイルで構成されているため単に以下のURLからファイルをダウンロードし自分のアプリと同じ ディレクトリにおくだけでも利用できます。

https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

ダウンロードするだけで言いというのは社内プロキシに虐げられていたり、そもそも直接ネットにつなげない 環境でもこれなら導入できるのでお手軽ですね。

最小限のアプリ

マニュアルのトップページとほぼ同じコードではありますが、簡単に動作確認をして見ましょう。 とりあえず、pipではなくDLした場合のディレクトリ構成はこんな感じです。 ※pipしたならbottle.pyはここに無くてよいです。

(bottle_sample) > ls -ltr
total 168
-rwxr-xr-x 1 debzow 197121 169668 Aug 30 22:27 bottle.py -- Bottle自体
-rw-r--r-- 1 debzow 197121      0 Aug 30 22:28 app.py    -- 自分で作成するファイル

ソースはこんな感じです。マニュアルのものを少し手直ししてコメントをつけました。

# coding: utf-8
# bottle.pyから使う関数をインポート
from bottle import route, run, template


# /hello/xxxとアクセスされたらindexという関数が呼ばれる
# xxxの部分は関数の引数として渡される
@route('/hello/<name>')
def index(name):
    # {{name}}の部分をname=で渡した文字列で置き換えてHTMLとして表示する
    return template('<b>Hello {{name}}</b>!', name=name)

if __name__ == "__main__":
    # テスト用のサーバをlocalhost:8080で起動する
    run(host='localhost', port=8080)

実行してみましょう。

(bottle_sample) > python app.py
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

プロンプトは戻りませんので、この状態でブラウザから以下のURLにアクセスします。

http://localhost:8080/hello/denzow

アクセスすると、ブラウザにはHello denzow!と表示されます。denzowの部分を別の文字にすると それぞれ表示される内容が変わるはずです。

これで最低限の動作確認ができましたので、プロンプトはctrl + cでサーバを停止しておきましょう。

まとめ

まずはBottleの導入部分についてまとめました。次はルーティングについてもう少し 複雑な内容をやってみたいと思います。

また、Bottleについて以前勉強会で使用した資料を 参考程度ですが載せて起きますのでよろしければごらんください。

https://www.slideshare.net/satoshiyamada71697/bottleweb