5.flaskを使ってウェブアプリを作成 – Pythonで始めるDropboxAPI

 Pythonの軽量ウェブアプリケーションFlaskを使ってウェブアプリを作ります。
 今回はflaskについての説明とFlaskの基本的な機能を紹介するサンプルを作ってみます。

もくじ

1.概要
 今回書くことについての説明をします。
2.DropboxAPIについて
 DropboxAPIがどんなものか、どういう仕組みで動いているのかについて説明します。
3.DropboxAPIを使う準備をする
 pythonからDropboxAPIを使うために必要な環境の準備をします。
4.サンプルプログラムを作る
 3で作成した環境を使ってサンプルプログラムを作ります。
5.flaskを使ってウェブアプリを作成 <ー今回はコレ
 ウェブフレームワークのflaskを使ってウェブアプリを作る練習をします。
6.Dropboxのフォルダ一覧を作る
 flaskを利用して、Dropboxのフォルダ一覧を表示するウェブアプリを作ります。
7.dotcloudで公開する
 PaaSのdotcloudを使い、6で作ったウェブアプリをデプロイすることでみんなに見てもらえるようにします。
8.参考
 参考にしたURLなど。

本記事のソースはGitHubにあります。


5. flaskを使ってウェブアプリを作成

 DropboxAPIを扱えるようになったので、次はウェブアプリを作成します。

5.1. flaskとは

 flaskはRailsのようなウェブフレームワークのひとつです。
 ただし、Railsのような全部揃ったフレームワークではなく、最小限のフレームワークだけを提供してくれる軽量フレームワークのひとつです。
 rubyで言えばsinatraのようなものです。

 FlaskはWerkzeug(ヴェルクツォィグ?)という便利なツールキットとjinja2というテンプレートエンジンを元に作られています。
 WerkzeugはWSGIアプリケーションを作るための便利なツールキットなんですが、これが本当に便利です。
 デバック中にエラーが発生した場合、トレース、ソース、エラー内容などが表示されます。
 ここまではよくある機能ですが、なんとこのウェブブラウザ上からpythonインタプリタと同じように変数を見たりすることができます。かなり便利です。
 jinja2はその名の通り「神社」から名付けられたテンプレートエンジンです。Djangoのテンプレートを意識して作られています。

5.2. Flask練習

5.2.1. はろーわーるど

 まずはハローワールドから。
 app に対してFlaskクラスのインスタンスを生成し、URLルーティング(“/”)に対して、index関数を割り当てている処理になります。
 下記のプログラムをsample.pyとして保存後、ターミナルから python sample.py とすると実行できます。
 Flaskはデフォルトではポート5000で動作しますので、ブラウザから「http://localhost:5000」とするとアクセスすることができます。
 indexでは”hello world!”と返しているので、ブラウザには「hello world!」と表示されるはずです。

sample.py
[python]
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
return "hello world!";

app.run()
[/python]

Screen Shot 2011 10 31 at 10 45 48 PM

5.2.2. HTMLテンプレート

 最初の例では、returnでそのまま文字列を返していましたが、実際にはそんなことしてたら面倒なので、元となるhtmlファイルをベースに、その一部を置き換えることで簡単に出力を作成する例を紹介します。

sample2.py
[python]
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/list")
def list():
books = ["book1", "book2", "book3"]
return render_template("list.html", items=books)

app.run()
[/python]

templates/list.html
[html]
<html>
<head></head>
<body>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
[/html]

 ここでは、/list というURLの戻り値として、render_template(“list.html”, items=items)の戻り値が返されています。
 これは”list.html”を元に、itemsというテンプレート変数にbooksを割り当ててテンプレートを展開する、という処理です。
 flaskの場合、アプリケーション実行ファイル(今回はsample2.py)があるディレクトリのtemplatesディレクトリの中にテンプレートを探しに行きます。ですので、templatesディレクトリを作成し、その中にlist.htmlを作成します。以下のようなディレクトリ階層になっています。

  testapp
     |-- sample2.py
     |-- templates
            |-- list.html

Screen Shot 2011 10 31 at 10 52 27 PM

5.2.3. URLの作成&リダイレクト

 ウェブアプリ内でリンクを作成するとき、ルーティングを考慮してURLを作成するurl_forという便利な処理があります。
 また、あるURLに来たアクセスを別のURLに渡すredirectという処理があります。
 ここではその例を紹介します。

sample3.py
[python]
from flask import Flask, url_for, redirect

app = Flask(__name__)

@app.route("/to_list")
def to_list():
return redirect("/list")

@app.route("/")
def index():
return redirect(url_for(‘show_list’))

@app.route("/list")
def show_list():
return "list"

app.run()
[/python]

 ここでは”/”へのアクセスを、show_listのルーティングURL(”/list”)に対してリダイレクトしています。
 url_forはテンプレートの中でも使えます。

5.2.4. テンプレートでurl_for

sample4.py
[python]
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
return render_template("index.html")

@app.route("/hello")
def hello():
return "hello!"
app.run()
[/python]

templates/index.html
[html]
<html>
<head></head>
<body>
<a href="{{ url_for(‘hello’) }}">hello</a>
</body>
</html>
[/html]

  testapp
     |-- sample4.py
     |-- templates
            |-- index.html

5.2.5. 更に詳しく

 flaskのチュートリアルやドキュメントが十分わかりやすいので、そちらを読むことをおすすめします。
 少しバージョンが古いですが日本語ドキュメントもこの方のおかげであります。
 –> Flaskへ ようこそ — Flask v0.5.1 documentation

次回

 これで必要な情報は全部そろったので、FlaskでDropboxAPIを使ってウェブアプリを作りましょう。
 次回は6.Dropboxのフォルダ一覧を作るです。