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」を作成します。
ファイルの内容は以下のとおり。


  1. # -*- coding:utf-8 -*-
  2. from bottle import route, run
  3. @route('/hello')
  4. def hello():
  5.     return "日本語でこんにちは!"
  6. run(host='localhost', port=8080, debug=True)




実行してみます。


$ python index.py



ブラウザで、http://localhost:8080/helloを表示してみると、こんな表示になるはずです。

159_01.png





パラメーターの受け取り



一つのメソッドに複数の@routeを指定できます。
URLのパラメーターを受け取るには、


  1. @route('/hello/<name>')



このように、括弧でくくってやります。


チュートリアル通りですが、こんなサンプルを動かしてみました。


  1. # -*- coding:utf-8 -*-
  2. from bottle import route, run
  3. @route('/')
  4. @route('/hello/<name>')
  5. def hello(name = u"知らない人"):
  6.     return u"こんにちは!" + name
  7. run(host='localhost', port=8080, debug=True)




http://localhost:8080/

初期値が表示されます。

159_02.png


http://localhost:8080/hello
http://localhost:8080/hello/

404 Not Found

159_03.png


http://localhost:8080/hello/symfo

symfoが表示されます。

159_04.png





その他のrouteルール



パラメーターの型をrouteで指定できます。

:int,:floatで数値型のみ許可。
:re:正規表現で、正規表現にマッチするものを許可。
:pathで、スラッシュも含めたパラメーターの受け取りとなります。


:intの例


  1. # -*- coding:utf-8 -*-
  2. from bottle import route, run
  3. @route('/<name:int>')
  4. def hello(name):
  5.     return str(name)
  6. run(host='localhost', port=8080, debug=True)



http://localhost:8080/abc

404エラー

159_05.png


http://localhost:8080/123

159_06.png



:pathの例


  1. # -*- coding:utf-8 -*-
  2. from bottle import route, run
  3. @route('/<name:path>')
  4. def hello(name):
  5.     return name
  6. run(host='localhost', port=8080, debug=True)




http://localhost:8080/abc/def/ghi

159_07.png





get,post



@route以外に、@get、@postという書き方が可能で、これでgetもしくはpostの
リクエストのみ受け付けるようにすることができます。

GETの場合

@get("/login")
または
@route("/login")




POSTの場合

@post("login")
または
@route("/login", method='POST')





じゃあ、postの場合のパラメーター取得はというと、こんな感じになるようです。

  1. name     = request.forms.get('name')
  2. password = request.forms.get('password')




getのクエリーパラメータの取得

  1. id = request.query.id




また、アップロードされたファイルは


  1. request.files.data



で取得できるようです。






静的ファイルの取得



画像やcss等の静的ファイルを使用する場合は、自動的に解決してくれないので、
自分でルーティングするルールを書いてやります。


  1. from bottle import static_file
  2. @route('/static/<filename>')
  3. def server_static(filename):
  4.     return static_file(filename, root='/path/to/your/static/files')



サンプルではファイルのパスを絶対パスで記載していますが、
相対パスでも大丈夫だと思います。








テンプレートの使用



テンプレートは、ソースと同じ階層に「views」というディレクトリを作成し、
そこに配置するようです。

使用するテンプレートを指定する方法は2通りあって、ますreturnするときに指定するパターン。


  1. @route('/hello')
  2. @route('/hello/<name>')
  3. def hello(name='World'):
  4.     return template('hello_template', name=name)




@viewで指定するパターン

  1. @route('/hello')
  2. @route('/hello/<name>')
  3. @view('hello_template')
  4. def hello(name='World'):
  5.     return dict(name=name)




テンプレートの記載ルールはこちら。
http://bottlepy.org/docs/dev/stpl.html

ドキュメントを斜め読みしただけなのでなんともですが、テンプレートエンジンにMakoやjinja2を
使用することもできるようです。



サンプルのソースコードはこちら。


  1. # -*- coding:utf-8 -*-
  2. from bottle import route, run, view
  3. @route('/<name>/<count:int>')
  4. @view("hello_template")
  5. def hello(name, count):
  6.     return dict(name=name, count=count)
  7. 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

159_08.png


なかなかいい感じです。






関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ