Pythonの軽量Webフレームワーク「Bottle」
WebアプリケーションをPythonで作成するときは、DjangoやZope、Pyramidが使われているんだと思います。
簡単なWebアプリケーションであれば、FlaskやWeb.pyでしょうか。
でも、もっと簡単な機能だけでいい。可能であれば1ファイルで収まるようなフレームワークはないものか。
欲を言えば、wsgiなサーバーでも動かしたい。
探していたら、「Bottle」といフレームワークを見つけたので試してみます。
http://bottlepy.org/docs/dev/
インストール
http://bottlepy.org/docs/dev/tutorial.html#installation
pipやeasy_install、apt-getでもインストールできるようです。
$ sudo pip install bottle # recommended
$ sudo easy_install bottle # alternative without pip
$ sudo apt-get install python-bottle # works for debian, ubuntu, ...
でも、今回は1ファイルだけで動くフレームワークを探しているので...
$ wget http://bottlepy.org/bottle.py
そう、まさにこんなフレームワークを探していたんですよ!
bottle.pyをダウンロードして動かしてみます。
Hello World
bottle.pyをダウンロードしたのと同じ階層に「index.py」を作成します。
ファイルの内容は以下のとおり。
- # -*- coding:utf-8 -*-
- from bottle import route, run
- @route('/hello')
- def hello():
- return "日本語でこんにちは!"
- run(host='localhost', port=8080, debug=True)
実行してみます。
$ python index.py
ブラウザで、http://localhost:8080/helloを表示してみると、こんな表示になるはずです。
パラメーターの受け取り
一つのメソッドに複数の@routeを指定できます。
URLのパラメーターを受け取るには、
- @route('/hello/<name>')
このように、括弧でくくってやります。
チュートリアル通りですが、こんなサンプルを動かしてみました。
- # -*- coding:utf-8 -*-
- from bottle import route, run
- @route('/')
- @route('/hello/<name>')
- def hello(name = u"知らない人"):
- return u"こんにちは!" + name
- run(host='localhost', port=8080, debug=True)
http://localhost:8080/
初期値が表示されます。
http://localhost:8080/hello
http://localhost:8080/hello/
404 Not Found
http://localhost:8080/hello/symfo
symfoが表示されます。
その他のrouteルール
パラメーターの型をrouteで指定できます。
:int,:floatで数値型のみ許可。
:re:正規表現で、正規表現にマッチするものを許可。
:pathで、スラッシュも含めたパラメーターの受け取りとなります。
:intの例
- # -*- coding:utf-8 -*-
- from bottle import route, run
- @route('/<name:int>')
- def hello(name):
- return str(name)
- run(host='localhost', port=8080, debug=True)
http://localhost:8080/abc
404エラー
http://localhost:8080/123
:pathの例
- # -*- coding:utf-8 -*-
- from bottle import route, run
- @route('/<name:path>')
- def hello(name):
- return name
- run(host='localhost', port=8080, debug=True)
http://localhost:8080/abc/def/ghi
get,post
@route以外に、@get、@postという書き方が可能で、これでgetもしくはpostの
リクエストのみ受け付けるようにすることができます。
GETの場合
@get("/login")
または
@route("/login")
POSTの場合
@post("login")
または
@route("/login", method='POST')
じゃあ、postの場合のパラメーター取得はというと、こんな感じになるようです。
- name = request.forms.get('name')
- password = request.forms.get('password')
getのクエリーパラメータの取得
- id = request.query.id
また、アップロードされたファイルは
- request.files.data
で取得できるようです。
静的ファイルの取得
画像やcss等の静的ファイルを使用する場合は、自動的に解決してくれないので、
自分でルーティングするルールを書いてやります。
- from bottle import static_file
- @route('/static/<filename>')
- def server_static(filename):
- return static_file(filename, root='/path/to/your/static/files')
サンプルではファイルのパスを絶対パスで記載していますが、
相対パスでも大丈夫だと思います。
テンプレートの使用
テンプレートは、ソースと同じ階層に「views」というディレクトリを作成し、
そこに配置するようです。
使用するテンプレートを指定する方法は2通りあって、ますreturnするときに指定するパターン。
- @route('/hello')
- @route('/hello/<name>')
- def hello(name='World'):
- return template('hello_template', name=name)
@viewで指定するパターン
- @route('/hello')
- @route('/hello/<name>')
- @view('hello_template')
- def hello(name='World'):
- return dict(name=name)
テンプレートの記載ルールはこちら。
http://bottlepy.org/docs/dev/stpl.html
ドキュメントを斜め読みしただけなのでなんともですが、テンプレートエンジンにMakoやjinja2を
使用することもできるようです。
サンプルのソースコードはこちら。
- # -*- coding:utf-8 -*-
- from bottle import route, run, view
- @route('/<name>/<count:int>')
- @view("hello_template")
- def hello(name, count):
- return dict(name=name, count=count)
- run(host='localhost', port=8080, debug=True)
views/hello_template.tpl
※tplという拡張子は、なくても読み込んでくれるようです。
こんにちは。<b>{{name}}</b>さん。<br />
<br />
{{count}}回ループするよ<br />
<br />
% for i in xrange(count):
{{i}}回<br />
% end
http://localhost:8080/symfo/5
なかなかいい感じです。
- 関連記事
コメント