上一篇中(Web應用中模板的工做流程分析),已經分析了模板的渲染流程,以及相關參數獲取及設置原理。這篇主要講述模板在實際應用案例。css
根據用戶輸入的兩次密碼,判斷兩次密碼是否一致,並將判斷後的結論用自定義的模板方法格式化輸出。html
備註:只爲知足演示實驗須要,不考慮密碼的安全性。安全
兩次密碼輸入一致時,下面顯示綠色的結論:app
兩次密碼輸入不一致時,實現紅色的結論:函數
其中,tornado
controllers:爲頁面控制器模塊,放置全部業務handlers.裏面再按業務模塊分類,好比咱們這裏放置了主頁、密碼兩個模塊;ui
static:爲靜態文件根目錄,放置圖片,css等靜態文件;url
templates:模板文件的根目錄,放置全部的模板文件。裏面一樣再按業務模板進行細分,好比這裏細分出了密碼模塊的子文件夾。spa
views:視圖模塊。主要爲一些跟頁面顯示有關的函數。好比自定義的模板方法(uiMethods)。debug
採起分層的方式組織代碼,清晰明瞭,並且易於維護。
(1)先看applicationConfigure.py,應用程序的配置。
STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static').replace('\\', '/') TEMPLATE_PATH = os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/') settings = { "static_path": STATIC_ROOT, "static_url_prefix": "/static/", 'debug': True, "template_path": TEMPLATE_PATH, } application = Application(handlers=[ url(r"/", MainHanlder), url(r"/story/([0-9]+)", StoryHanlder, dict(db=db), name="story"), url(r"/psw/check", PasswordRequestHandler), ], **settings)
主要設置template_path選項值以及url路由映射,訪問路徑url爲/psw/check以及相應的處理handler爲PaasswordRequestHandler。
template_path指定了模板的路徑爲源代碼的templates根目錄,爲實際的物理路徑。
(2)再看PaasswordRequestHandler.py的實現,位於controllers模塊下。
class PasswordRequestHandler(RequestHandler): def get(self, *args, **kwargs): password = self.get_argument("f") check_password = self.get_argument("s") datas={ "password": password, "checkPassword": check_password } self.render("password/check.html", **datas) def get_template_namespace(self): namespace = {} namespace = super(PasswordRequestHandler, self).get_template_namespace() uimethods={ "check": checkPasswordResult } namespace.update(uimethods) return namespace
重寫RequestHandler的兩個方法,get/get_template_namespace.其中,
get方法來接收請求,得到兩次輸入的密碼參數值,並組織數據,傳遞給模板。注意,傳遞的數據是以字典的形式組織的。
get_template_namespace用來註冊模板的自定義方法。這裏註冊名叫check的方法,而具體的實現位於views.password.uiMethods.py的checkPasswordResult方法。這樣,PasswordRequestHandler涉及的模板中均可以使用check自定義方法。
(3)看模板文件,check.html.這裏用html格式文件,原則上,任何文本格式的文件均可以。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>判斷兩次輸入密碼是否一致</title> </head> <body> 第一個輸入的密碼爲:{{ password }} <br/> 第二次輸入的密碼爲:{{ checkPassword }}<br/> 結論:{% raw check(password,checkPassword) %} </body> </html>
很簡單的一段代碼。取得兩次輸入密碼的值,而後得出結論。注意,結論的模板指令使用了raw關鍵字,用來表示結果的原樣輸入。稍後解釋爲何使用raw。
模板的語法使用說明請參考 這裏。
(4)checkPasswordResult 自定義模板方法的實現。位於views/password/uiMethods.py下。
def checkPasswordResult(first,second): """ 判斷兩次輸入密碼的一致性 :param first: 第一個密碼 :param second: 第二個密碼 :return: 是否一致的結果 """ result = "" if first == second: result = "<span style='color:green;'>兩次密碼輸入相同! </span>" else: result = "<span style='color:red;'> 兩次密碼輸入不相同!</span>" return result
邏輯很簡單,就是若是兩次密碼相同,則輸出綠色的結論,若是不相同,則輸出紅色的結論。這裏用html的樣式來表示顏色,返回的也是包含html的字符串。
再來回答上面提出的問題,模板文件的結論渲染指令中爲何用raw關鍵字。由於tornado模板的輸出在默認狀況下是被轉義的,若是不用raw關鍵子,checkPassswordResult方法返回的結果被原樣輸出在遊覽器中,而不會當成是html格式的文本內容。
若是把raw關鍵子去掉,結果以下: