Table Of Contents

Previous topic

SQLAlchemyを使う

Next topic

POSTメソッドでデータを変更できるようにする

This Page

Flaskでモデルを使う

GETに対応する

前章で用意したモデル を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 %}

コンテンツがリスト表示されることを確認します。

_images/flaski3.png

ここまでのGitHub