03 03 2013 Python Flask SQLAlchemy Tweet
初めてのFlaskアプリ
ディレクトリを用意します。
mkdir flaski
cd flaski
以下のコードをapp.pyとして保存します。ちなみにFlaskのサイトに載っているものです。
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
Flaskで開発する準備が整っていれば、python app.pyと叩けば127.0.0.1:5000でウェブサーバーが起動します。
/にアクセスした場合にHello Worldという文字列を返すように設定して(4-6行目)、app.runでアプリを起動させています。
$ python app.py * Running on http://127.0.0.1:5000/
テンプレートの導入
単なる文字列だと味気無いのでテンプレートエンジンを使ってもう少し複雑なHTMLを表示してみます。ディレクトリの構成を表示しておきます。
. ├── app.py ├── static │ └── snake.jpg └── templates ├── index.html └── layout.html
cssや画像などのファイルはstaticというディレクトリに配置します。今回はsnake.jpgを表示してみます。
FlaskのテンプレートエンジンはJinja2です。Flask内でテンプレートを扱うにはrender_template関数を用い、テンプレートはtemplatesディレクトリに配置します。
templatesディレクトリにはlayout.html,index.htmlの2つのファイルを用意します。
layout.html
<!DOCTYPE html> <html> <head> <title>flaski</title> </head> <body> {% block body %}{% endblock %} </body> </html>
index.html
{% extends "layout.html" %} {% block body %} <h1>{{title}}</h1> <img src="{{url_for('static', filename='snake.jpg')}}" alt="snake"/> {% endblock %}
{{}}で囲むと変数を展開することができます。今回はtitleをapp.pyのrender_templateで渡しています。url_forはエンドポイントを指定するとURLに展開する関数です。
app.pyはrender_templateをインポートしてhello関数で使うようにします。
また今回からデバッグモードで動かすようにapp.configをいじっています(3行目)ので、ファイル更新時に自動リスタートしたり、エラーがあればブラウザにデバッグのための情報が出力されるようになります。
from flask import Flask, render_template app = Flask(__name__) app.config['DEBUG'] = True @app.route("/") def hello(): return render_template("index.html", title="Flaski") if __name__ == "__main__": app.run()
先ほどと同様にhttp://127.0.0.1:5000/にアクセスすると今度は画像つきのHTMLが表示されます。
ここまでのGitHub
まとめ
FlaskでJinja2のテンプレートエンジンを使ってみました。
Flaskは何であって何でないかによると
Flask itself just bridges to Werkzeug to implement a proper WSGI application and to Jinja2 to handle templating.
ということなので、テンプレートエンジンはJinja2を利用するのがベストです。
補足
Jinja2自体はその上に別の構文を被せることができるので、JadeやHamlも利用することができます。
個人的にはインデントでネストを表現するJadeの構文を気に入っているのでPyJadeを使うことが多いです。