今回は見た目、てことで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 件のコメント:
コメントを投稿