2014.12.23
Pythonの軽量WebフレームワークBottleを試してみた(その1) – ルーティング編 (Advent Calendar 23日目)
この記事はPython Advent Calendar 2014 – Qiita 23日目 兼
アライドアーキテクツ Advent Calendar 23日目の記事です。
こんにちは。関根です。
最近は社内の有志でPythonの勉強会を開いたり、
また定期的にPythonもくもく会などを開催したりしています。
Pythonもくもく会はおかげさまで順調に回を重ねており、つい先日3回目が終了しました。
また来月も開催予定ですので、お時間の合う方のご参加をお待ちしています。
Web業界をはじめとして他の業種の方や、専門分野の異なる方も参加するゆるい会になっていますので、気兼ねなく参加できると思います。(初心者の方も大歓迎です!)
はじめに
PythonでWebアプリケーションを作成する場合、フルスタックのフレームワークから、軽量のものまで様々な選択肢が存在します。
Djangoのようなフルスタックのフレームワークは、慣れればとても便利な機能が多く、使いやすいと思います。しかしフルスタックであるがゆえに、最初に覚えることが多く、これからPythonを初めてみようかなという人には若干敷居が高いように感じます。
これまで社内で何度かDjangoの勉強会を行ってきましたが、チュートリアルを行って、理解してもらうだけでも結構大変だった印象があります。
そこで本日は、Python初心者の方でもお手軽に試すことができるPythonの軽量WebフレームワークであるBottleを紹介し、またBottleの主要な機能であるルーティングについて説明していきたいと思います。
Bottleとは
BottleとはPython製の軽量Webフレームワークです。動作が速く、シンプルなのが特徴です。
Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library.
公式サイトより引用
個人的な感想としては、簡単なアプリケーションをお手軽に作りたい場合や、状態をあまり持たないAPIサーバなどを開発するのに向いていると思っています。
また1つのファイルのみで提供されているので、フレームワークの作り方とか、仕組みなどを勉強する場合にも、とても良い教材になるのではないでしょうか。需要があれば、ソースコードリーディングもやりたいと思っています。
それでは実際にBottleを用いてHelloWorldアプリケーションを作成して、
フレームワークの雰囲気を掴んでみることにしましょう。
インストール
まずはBottleのインストールを行います。Bottleは1つのファイルで提供されているので、次のようにダウンロードして使用することも可能です。
1 |
wget http://bottlepy.org/bottle.py |
しかし後ほどライブラリを使用するときのために、今回のサンプルでは、virtualenvとpipを利用して、仮想環境を作成していきます。(virtualenv、pipについてはここでは詳細を解説しません。Web上にたくさんの記事や、ドキュメントが存在していますので、そちらを参考にしてください。)
参考リンク
仮想環境の作成
まずは仮想環境を作成します。
1 2 3 |
virtualenv bottle_sample cd bottle_sample/ source bin/activate |
Bottleのインストール
続いてBottleをインストールします。とても簡単ですね。
1 |
pip install bottle |
念のためインストールされているか、確認します。
1 |
pip freeze |
確認
1 2 |
bottle==0.12.7 wsgiref==0.1.2 |
HelloWorldの作成
いよいよHelloWorldアプリケーションの作成です。hello_world.pyというファイルを作成して、次のソースをそのまま入力して、保存します。
1 2 3 4 5 6 7 8 9 10 11 |
from bottle import route, run # routeデコレーター # これを使用してURLのPathと関数をマッピングする。 @route('/hello') def hello(): return "Hello World!" # ビルトインの開発用サーバーの起動 # ここでは、debugとreloaderを有効にしている run(host='localhost', port=8080, debug=True, reloader=True) |
起動
次にコマンドラインから下記のコマンドを打ち込み、ブラウザから、http://localhost:8080/hello にアクセスします。
1 |
python hello_world.py |
成功すると、画面上にHello World!の文字が表示され、プログラムを起動したコンソールにはアクセスログが表示されます。たった数行記載するだけで、簡単なアプリケーションを作成することができるようになりました。素晴らしいですね。
1 2 3 4 5 6 7 |
Bottle v0.12.7 server starting up (using WSGIRefServer())... Listening on http://localhost:8080/ Hit Ctrl-C to quit. 127.0.0.1 - - [23/Dec/2014 13:09:37] "GET /hello HTTP/1.1" 200 12 127.0.0.1 - - [23/Dec/2014 13:09:37] "GET /hello HTTP/1.1" 200 12 127.0.0.1 - - [23/Dec/2014 13:09:38] "GET /hello HTTP/1.1" 200 12 |
ルーティング
上記のHelloWorldのサンプルでは、routeデコレーターで、/helloに対応する関数のマッピングを指定しました。Bottleのルーティングでは他にも、さまざまな指定ができるので、簡単にご紹介したいと思います。
ダイナミックルーティング
デコレーターの中で、次のように指定することでダイナミックにルーティングの指定をする事ができるようになります。またnameに該当する箇所を関数の中で取得して使用する事ができます。
1 2 3 4 |
# http://localhost:8080/hello/name @route('/hello/<name>') def hello(name): return template('Hello {{name}}', name=name) |
また次のようにルーティングの指定をintやfloatの数値に限定したり、
任意の正規表現やファイルパスなどに限定することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 数値のみ(integer) # http://localhost:8080/post/1 @route('/post/<id:int>') def post(id): return template('id={{id}}', id=id) # 正規表現で指定 # http://localhost:8080/tags/python @route('/tags/<tag_name:re:[a-z]+>') def tags(tag_name): return template('tag_name={{tag_name}}', tag_name=tag_name) # ファイルパスの文字列のみ指定 # http://localhost:8080/file/upload/a.jpg @route('/file/<file_path:path>') def serve(file_path): return template('file_path={{file_path}}', file_path=file_path) |
HTTPメソッド
GETメソッドや、POSTメソッドを明示的に指定したい場合には、@get、@post、@put、@deleteデコレーターを使用します。またrouteメソッドに明示的に引数を記述することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from bottle import get, post, request # @route('/resource')と同じ意味 @get('/resource') def get_resource(): # 何か処理をする return "" # @route('/resource', method='POST')と同じ意味 @post('/resource') def post_resource(): # 何か処理をする return "" # @route('/resource', method='PUT')と同じ意味 @put('/resource') def put_resource(): # 何か処理をする return "" # @route('/resource', method='DELETE')と同じ意味 @delete('/resource') def delete_resource(): # 何か処理をする return "" |
まとめ
いかがでしたでしょうか? 今回はBottleをご紹介する第1回目の記事ということで、主にBottleの概要とルーティングについて解説しました。
今回学習したルーティングと簡単なテンプレートの書き方さえ覚えれば、すぐにでもアプリケーションを作っていくことが可能です。次回は主にレスポンスの返却方法と、テンプレートの使い方について解説していこうと思います。
追記(2015/04/03)
一部内容修正致しました。またルーティング以降の内容を次の書籍に書きました!
ぜひ参考にして頂ければ幸いです!
Python、JavaScript関連の話題を中心に、ソフトウェア開発全般に関するお話を書いていこうと思います。