はじめに
前回、index.htmlとlogin.htmlを作成した。<div class=”blog-body”></div>中だけ異なり、その他は同じ内容だった。
これからhtmlが増えた場合、同じ内容をコピーするのは大変である。また、共通部分が変更になった場合に全てのファイルの部分を書き換えるのもミスしてしまう。
そこで、共通部分は1ファイルに書いておき、流用できるようにする。
レイアウトのベーステンプレートを作る
templatesフォルダに以下の内容でlayout.htmlファイルを作成する。
<!DOCTYPE html>
<title>Flask Blog</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<div class="container">
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">Flask Blog</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="nav navbar-nav navbar-right">
<li class="nav-item">
<a class="nav-link" href="/login">ログイン</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">ログアウト</a>
</li>
</ul>
</div>
</nav>
<div class="blog-body">
{% block body %}{% endblock%}
</div>
</div>
共通部分を転記した。
異なる部分は {% block body %}{% endblock%}である。次に、この部分だけを各html上書きできるようにindex.htmlとlogin.htmlを変更する。
index.htmlファイルの変更
index.htmlファイルを変更する。
{% extends "layout.html" %}
{% block body %}
Flaskテスト
{% endblock %}
最初に以下を宣言するだけで、layout.htmlファイルの内容を引き継ぎ、ベースとすることができる。
{% extends "layout.html" %}
layoutファイルに記載されている以下の内容を記録することで、この部分の中身を置き換えることができる。
{% block body %}
Flaskテスト
{% endblock %}
login,htmlファイルの変更
login.htmlファイルも同様に変更する。
{% extends "layout.html" %}
{% block body %}
<form action="/login" method=post>
<div class="form-group">
<label for="InputTitle">ユーザ名</label>
<input type="text" class="form-control" id="InputTitle" name=username>
</div>
<div class="form-group">
<label for="InputPassword">パスワード</label>
<input type="password" class="form-control" id="InputPassword" name=password>
</div>
<button type="submit" class="btn btn-primary">ログイン</button>
</form>
{% endblock %}
これで、共通部分はlayout.htmlに追加し、異なる部分だけそれぞれのhtmlに書けばよくなる。
終わりに
ログインフォームを作成したが、このままでは欠陥がある。
本来は、ログインが成功したときだけホームに移動するさせたい。
そこで、ログインしただけFlaskテストが表示できるようにする。
次回はログインしていない場合はログイン画面に自動で遷移できるようにしたい。
コメント