さて大まかなwebページの表示のさせ方はだいたいわかった。では見栄えのするページをどうするかだが、一から作ってては一向に完成に向かわないだろうから既成のフレームワークを導入する。
そこでBootstrapのお出まし。これ使うとデフォルトでツイッターのページと同じような見栄えがすぐできちゃう。なにせもともとはTwitter bootstrapという名前でtwitterが開発したものなんで。
使い方も
(venv) $ pip3 install flask-bootstrap
でインストールし、hello.pyに
from flask_bootstrap import bootstrap
# from flask.ext.bootstrap import bootstrapは推奨されなくなった
と
bootstrap = Bootstrap(app)
の2行をふやすだけ。これだけでなんか見栄えのするページができてしまう。
先日作成したflaskrのページで設定していたbase.htmlのあたりをbootstrapが用意してくれているのでコンテンツのところだけ自分で用意すればいいってことだね。
デフォルトでできるページはtitle、navbar、contentの3つのブロックでできている。デフォルトではbase.htmlはbootstrap/base.htmlにあって、これ自体の編集はしないようになっている。
もしbase.htmlに変更を入れたいときはtemplate/base.htmlを作成してそちらに変更を加えると良いようだ。
デフォルトでできるページだとnavbarのFlaskyとHomeをクリックするとindex.htmlにリンクし、index.htmlにnavbarなどの設定が書かれていない場合、そっけない素のhtmlが表示されることになるがbase.htmlにnavbar等の設定を書いておけばそちらが表示に使われるようだ。
ここまでのソース
hello.py
from flask import Flask, render_template from flask_script import Manager from flask_bootstrap import Bootstrap app = Flask(__name__) manager = Manager(app) #flask_scriptを導入して拡張した部分。起動するときはpython3 hello.py runserverといううかんじで。 bootstrap = Bootstrap(app) #bootstrapを使う設定 @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('500.html'), 500 #エラー処理として、エラーのときにはそれぞれ該当するファイルを表示させる。template/に404.htmlと500.htmlの2ファイルを置く。 @app.route('/') def index(): return render_template('index.html') #render_templateを使ってtemplate/index.htmlの中身を読み込む @app.route('/user/<name>') def user(name): return render_template('user.html', name=name) #name=nameの左側のnameはtemplate(user.html)のなかでプレースホルダ({{}}の中身)として名付けられた引数としてのname。右側のnameはここで得られた変数としてのname。 if __name__ == '__main__': manager.run() #managerを通して起動
bootstrap/base.htmlに
{% block navbar %} {%- endblock navbar %}
こういう部分があるが
template/base.htmlに
{% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {% block navbar %} <div class="navbar navbar-inverse" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/">Flasky</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li><a href="/">Home</a></li> </ul> </div> </div> </div> {% endblock %} {% block content %} <div class="container"> {% block page_content %}{% endblock %} </div> {% endblock %}
こういう感じでnavbarを組み込んでしまっている。
index.html
{% extends "base.html" %} {% block page_content %} <div class="page-header"> <h1>Hello World!</h1> </div> {% endblock %}
template/base.htmlで拡張したbase.htmlにさらにindex.htmlから{% block page_content %}〜{% endblock %}の部分を入れ込む。
ユーザー名をurlから読み込んだ場合はこっちが埋め込まれる。
user.html
{% extends "base.html" %} {% block page_content %} <div class="page-header"> <h1>Hello, {{ name }}!</h1> </div> {% endblock %}