既上一篇,tornado如何建置web服務到套用template機制可以建立一個動態web網站(連結)
而template最棒的地方就是實現觀注點分離
然後以下展示一下如何透過template樣版來建立動態資料清單印出集合
還記得test的網站結構下有一個test.html檔案
{% extends __base.html %}
{% block content %}
<div class="container" style="padding: 60px 20px;">
Hello , <font color="red">{{name}}</font>!!<br>
<p>Welcome to Here!!</p>
<p>
<h3>我的推薦書單</h3>
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>編號</th>
<th>書名</th>
<th>出版社</th>
<th>作者</th>
<th>定價</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</p>
<p>
About Paul<br><br>
我是一個it與程式開發的熱愛者<br><br>
總愛玩一些新的、有趣的東西,以此站台記念<br><br>
</p>
</div>
{% end %}
假定我們的book model如下:
創建一個recommand_book_model.py檔案定義我們的Model(註,若是放在同一個module下的話,之後可以直接使用,若是跨module的時候,就必須import)
class RecommandBookModel(object):
def __init__(self, isbn, name, publisher, author, price):
self.isbn = isbn
self.name = name
self.publisher = publisher
self.author = author
self.price = price
當我們請求這個網頁的時候,透過handler得知需要取得來自於後端資料庫的書單資料(例)
怎麼從資料庫取資料,我們先略過,假如已經取得資料了,我們希望binding到tempalte上可以直接self.render的時候,直接指定model名稱與值給render方法:
class HomeHandler( tornado.web.RequestHandler ):
def get(self):
#get book list from database
book_list = [RecommandBookModel("978-986-201-788-3", "無瑕的程式碼-番外篇", "博碩文化", "Robert C. Martin", 340),
RecommandBookModel( "978-986-347-702-0", "Effective Python中文版", "碁峰資訊", "Brett Slatkin", 450 ),
RecommandBookModel( "978-986-94410-0-1", "時間的形狀", "經濟新潮社", "汪潔", 380 ),
]
self.render("test.html", name="Friend", book_list = book_list)
test.html的表格tbody標籤之間,我們可以這樣定義:
<table class="table">
<thead>
<tr>
<th>編號</th>
<th>書名</th>
<th>出版社</th>
<th>作者</th>
<th>定價</th>
</tr>
</thead>
<tbody>
{% for book in book_list %}
<tr>{{book.isbn}}</tr>
<tr>{{book.name}}</tr>
<tr>{{book.publisher}}</tr>
<tr>{{book.author}}</tr>
<tr>{{book.price}}</tr>
{% end %}
</tbody>
</table>
重新跑localhost:9999之後,我們就可以看到清單出來了,注意若是程式流程要使用{% statement %},若是binding value的話,就是透過{{model.attribulte}}
然而我有遇到model是在其他module裡面的情況,若是如此,沒有進行適當的import,template會報錯提示,例如沒有相關的屬性之類的訊息
這個時候,必須在template最上面引用 {% import xxxx.yyyyy.zzzzz.module %},那麼就可以正常引用進來了~