=====================
初めてのFlaskアプリ
=====================
まずは動かしてみよう!
======================
Flaskアプリ開発用のディレクトリを用意します。
.. code-block:: sh
mkdir flaski
cd flaski
以下のソースコードをapp.pyとして保存します。`Flask `_ のサイトに載っているものです。
.. code-block:: python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
.. note:: インデックスルートにアクセスした場合にHello Worldという文字列を返すように設定して(4-6行目)、app.runでサーバーを起動させています。
さぁ、動かしてみましょう、python app.pyと叩けば127.0.0.1:5000でウェブサーバーが起動します。
.. code-block:: sh
$ python app.py
* Running on http://127.0.0.1:5000/
ブラウザで `localhost `_ にアクセスすると次のように表示されるはずです
.. image:: static/flaski1.png
テンプレートの導入
==================
単なる文字列を出力するだけではものたりないので、今度はテンプレートエンジンを使い、もう少し複雑なHTMLを表示してみます。Flaskのテンプレートエンジンは `Jinja2 `_ ですので、これを使います。
最終的なファイルとディレクトリの構成を表示しておきます。
Flaskアプリの場合にはテンプレートはtemplatesディレクトリ、画像ファイルやjs,cssなどの静的ファイルはstaticディレクトリに配置することになりますので注意してください。
.. code-block:: sh
.
├── app.py
├── static
│ └── snake.jpg
└── templates
├── index.html
└── layout.html
まずは `snake.jpg `_ をダウンロードしてstaticディレクトリに配置してください。
続いてtemplatesディレクトリにlayout.html,index.htmlの2つのファイルを用意します。
layout.html
.. code-block:: html
flaski
{% block body %}{% endblock %}
index.html
.. code-block:: html
{% extends "layout.html" %}
{% block body %}
{{title}}
{% endblock %}
{{}}で囲むと変数を展開することができます。今回はtitleをapp.pyのrender_templateで渡しています。url_forはエンドポイントを指定するとURLに展開する関数です。urlは極力ハードコードするのを避け、url_forを使うのがいいと思います。
app.pyはrender_templateをインポートしてhello関数で使うようにします。
また今回からデバッグモードで動かすようにapp.configをいじっています(3行目)。
- ファイル更新時に自動リスタート
- エラーがあればブラウザにデバッグのための情報が出力される
- その際ブラウザからデバッグのために変数を出力したりできる
といったことができるので開発時には便利ですが、本番時には必ずfalseにしましょう。
.. code-block:: python
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が表示されます。
.. image:: static/flaski2.png
Flaskとは何か?
===============
FlaskでJinja2のテンプレートエンジンを使ってみましたが、
`Flaskは何であって何でないか `_ によると
Flask itself just bridges to Werkzeug to implement a proper WSGI application and to Jinja2 to handle templating.
つまり、FlaskはJinjaをテンプレートエンジンにすえたウェブアプリケーションのためのマイクロなフレームワークです。
フルスタックなウェブアプリケーションフレームワークにあるような、モデル操作の
ためのORマッパーは用意されていないため、好きなものを利用できます。
次からはORマッパーとしてSQLAlchemyを使っていきます。
Jinja2の補足
============
Jinja2自体はその上に別の構文を被せることができるので、 `Jade `_ や `Haml `_ も利用することができます。
- `Hamlish-jinja `_
- `pyjade `_
個人的にはインデントでネストを表現するJadeの構文を気に入っているので
PyJadeを使うことが多いですが、Jinjaの機能の一部が使えなくなるので自分にあったものを使うと良いでしょう。
ここまでのGitHub
================
ソースコードはGitHubに用意してあるので、diffをチェックするとより分かりやすいかと思います。
- `Hello Worldまで `_
- `テンプレート導入 `_