前章で用意したモデル を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()
Note
database.pyでBaseクラスにqueryメソッドを追加しておいたので、 WIkiContentクラスから、allで全件検索、filter_byでフィルタリングがで きるようになっています。詳しくはSQLAlchemyのドキュメントを参照してください。
app.routeでは<>で囲むことで/以下の文字列を、変数titleとしてキャプチャしています。 show_content関数は、モデルに対し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 %}
コンテンツがリスト表示されることを確認します。