Drkcore

03 03 2013 Python Flask SQLAlchemy Tweet

FlaskとSQLAlchemyでつくるreStructuredTextなWiki (1)

初めての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/

flaski1

テンプレートの導入

単なる文字列だと味気無いのでテンプレートエンジンを使ってもう少し複雑な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が表示されます。

flaski2

ここまでのGitHub

  • Hello Worldまで
  • テンプレート導入

まとめ

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も利用することができます。

  • Hamlish-jinja
  • pyjade

個人的にはインデントでネストを表現するJadeの構文を気に入っているのでPyJadeを使うことが多いです。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021