03 03 2013 Python Flask SQLAlchemy Tweet
Flaskでモデルを使う
先に用意したモデルをFlaskで使うにモデルをimportします。
ルートにアクセスしたらコンテンツのタイトル一覧を表示します。さらに、/titleにアクセスしたら内容を表示するようにします。
app.py
from flask import Flask, render_template, abort from flaski.models import WikiContent app = Flask(__name__) app.config['DEBUG'] = True @app.route("/") def hello(): contents = WikiContent.query.all() return render_template("index.html", contents=contents) @app.route("/<title>", methods=["GET"]) def show_content(title): content = WikiContent.query.filter_by(title=title).first() if content is None: abort(404) return render_template("show_content.html", content=content) if __name__ == "__main__": app.run()
database.pyでBaseクラスにqueryメソッドを追加しておいたので、WIkiContentクラスから、allで全件検索、filter_byでフィルタリングができるようになっています。
app.routeで<>で囲むと変数としてキャプチャしています。title名で検索をかけ、データが存在しない場合は404エラーを返します(abort(404))。
index.html
{% extends "layout.html" %} {% block body %} <h1>Flaski</h1> <img src="{{url_for('static', filename='snake.jpg')}}" alt="snake"/> <ul> {% for content in contents %} <li><a href="{{url_for('show_content', title=content.title)}}">{{content.title}}</a></li> {% endfor%} </ul> {% endblock %}
for文でcontentsをループさせ、タイトルをリンク付きでリスト表示させる処理を新たに追加しています。タイトルはapp.pyから送る必要がないので、ハードコードするようにしました。
新たに個別のコンテンツ用のテンプレートも用意します
show_content.html
{% extends "layout.html" %} {% block body %} <h1>{{content.title}}</h1> <div>{{content.body}}</div> <p>{{content.date}}</p> {% endblock %}
コンテンツがリスト表示されることを確認します。
ここまでのGitHub
まとめ
FlaskとSQLAlchemyを連携させてデータ検索、表示するようにしました。