今回は見た目、てことでbottleのテンプレート機能を使ってみたいと思います。
ざっくり言うと、変数やコードを埋め込んだ、画面のひな形です。
早速使ってみる
まずは使ってみましょう。テンプレートファイルはbottleを実行したディレクトリ以下のviewsに置き、拡張子は*.tplとします。(static等は気にしないで下さい。前回利用したものです。)
(dev001)kitabat@clientX% pwd
/home/kitabat/dev001
(dev001)kitabat@clientX% tree work
work
├── hello.py
├── static
│ ├── css
│ │ └── default.css
│ └── img
│ └── city.jpg
└── views
└── top.tpl
4 directories, 4 files
今回はtop.tplとしました。内容は以下の通りです。
<html>
<head><title>hoge</title></head>
<body>
message:{{message}}
</body>
</html>
4行目の{{message}}部分が変数です。ここに色々な値を与える事が出来ます。
ではいつものhello.pyに、こんなコードを書いてみましょう。
hello.py
from bottle import route, run, static_file, view
import datetime
@route('/')
@route('/<hoge>')
@view('top')
def hello(hoge="root"):
m = "today is %s" % str( datetime.date.today().isoformat() )
return dict(message = m)
@route('/file/<filename:path>')
def static(filename):
return static_file(filename, root="/home/kitabat/dev001/work/static")
run(host='0.0.0.0', port=8080, debug=True, reloader=True)
前回からの変更点のみ、記載します。
まず1行目、bottleのview機能を利用する定義を追記しています。
次のimport datetimeは日時関連の処理をする為の標準ライブラリです。
ポイントは6行目。これもデコレータですね。先ほど作成したテンプレートファイルの、拡張子を除いた名前を与えます。これで、以下のhello()関数ではtop.tplテンプレートを使う、という意味になります。
8行目は今日の日付を取得しているだけです。
9行目、ここもポイントです。こんな感じで辞書型の変数をreturnする事で、テンプレートに値が渡ります。
先ほど、テンプレートファイルに書いた変数を思い出してください。{{message}}でしたね。{{ }}にはreturnで返した辞書型変数のキーを書きます。そこがバリューに置換えられます。
このようにして、今回は1つでしたが、複数のキーとバリューをテンプレートに渡す事が出来るという訳です。
アクセス結果は以下の通り。
テンプレートにコードを埋め込む
ぶっちゃけ、今回くらいの処理であれば、わざわざ値を渡さなくても、テンプレート内にpythonコードを埋め込む事で、実現出来てしまいます。
では、コードを埋め込む方法をご紹介します。
<%
import datetime
m = "today is %s" % str( datetime.date.today().isoformat() )
%>
<html>
<head><title>hoge</title></head>
<body>
message : {{m}}
</body>
</html>
はい、この通り、<% と %> で囲った部分にコードを書けばOKです。
あるいはコードが1行だけなのであれば、行の頭に % を付けても良いです。
テンプレート内で定義した変数であっても、HTML内で参照する場合は {{ }} で囲みます。
ではサイトにアクセスしてみて下さい。テンプレートを変更しただけですが、先程と同じ結果が得られると思います。
もう少し複雑なコード
テンプレートにコードを埋め込む際の注意点ですが、インデントは無視されます(可読性のためにインデントするのは自由です)。
ではif文など、区切りはどう表現するかというと、end というキーワードを明示的に書きます。
例えばこんな、、、。
if文だけでなく、for文や関数定義等、pythonでインデントして区切りを表す部分には、終わりに必ずendを書きます。
これもhello.py側の変更は不要です(無駄な処理は残ってますが)。アクセスしてみて下さい。適切な挨拶が、なされましたか?
<%
import datetime
hour = datetime.datetime.now().hour
if hour > 18 or hour < 5:
m = "good evening."
elif hour >= 5 and hour < 10:
m = "good morning."
else:
m = "hello."
end
%>
<html>
<head><title>hoge</title></head>
<body>
message : {{m}}
</body>
</html>
if文だけでなく、for文や関数定義等、pythonでインデントして区切りを表す部分には、終わりに必ずendを書きます。
これもhello.py側の変更は不要です(無駄な処理は残ってますが)。アクセスしてみて下さい。適切な挨拶が、なされましたか?
はい、早く寝ましょうね。では今回はこの辺で。


0 件のコメント:
コメントを投稿