Table Of Contents

Previous topic

仮想環境を構築する

Next topic

SQLAlchemyを使う

This Page

初めてのFlaskアプリ

まずは動かしてみよう!

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()

Note

インデックスルートにアクセスした場合にHello Worldという文字列を返すように設定して(4-6行目)、app.runでサーバーを起動させています。

さぁ、動かしてみましょう、python app.pyと叩けば127.0.0.1:5000でウェブサーバーが起動します。

$ python app.py
 * Running on http://127.0.0.1:5000/

ブラウザで localhost にアクセスすると次のように表示されるはずです

_images/flaski1.png

テンプレートの導入

単なる文字列を出力するだけではものたりないので、今度はテンプレートエンジンを使い、もう少し複雑なHTMLを表示してみます。Flaskのテンプレートエンジンは Jinja2 ですので、これを使います。

最終的なファイルとディレクトリの構成を表示しておきます。

Flaskアプリの場合にはテンプレートはtemplatesディレクトリ、画像ファイルやjs,cssなどの静的ファイルはstaticディレクトリに配置することになりますので注意してください。

.
├── app.py
├── static
│   └── snake.jpg
└── templates
    ├── index.html
    └── layout.html

まずは snake.jpg をダウンロードしてstaticディレクトリに配置してください。

続いて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に展開する関数です。urlは極力ハードコードするのを避け、url_forを使うのがいいと思います。

app.pyはrender_templateをインポートしてhello関数で使うようにします。

また今回からデバッグモードで動かすようにapp.configをいじっています(3行目)。

  • ファイル更新時に自動リスタート
  • エラーがあればブラウザにデバッグのための情報が出力される
  • その際ブラウザからデバッグのために変数を出力したりできる

といったことができるので開発時には便利ですが、本番時には必ずfalseにしましょう。

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が表示されます。

_images/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自体はその上に別の構文を被せることができるので、 JadeHaml も利用することができます。

個人的にはインデントでネストを表現するJadeの構文を気に入っているので PyJadeを使うことが多いですが、Jinjaの機能の一部が使えなくなるので自分にあったものを使うと良いでしょう。

ここまでのGitHub

ソースコードはGitHubに用意してあるので、diffをチェックするとより分かりやすいかと思います。