tornado學習筆記11 Web應用中模板(Template)使用應用實踐

       上一篇中(Web應用中模板的工做流程分析),已經分析了模板的渲染流程,以及相關參數獲取及設置原理。這篇主要講述模板在實際應用案例。css

11.1 需求

      根據用戶輸入的兩次密碼,判斷兩次密碼是否一致,並將判斷後的結論用自定義的模板方法格式化輸出。html

      備註:只爲知足演示實驗須要,不考慮密碼的安全性。安全

 

11.2 結果預覽

      兩次密碼輸入一致時,下面顯示綠色的結論:app

image

     兩次密碼輸入不一致時,實現紅色的結論:函數

image

11.3 代碼結構

image

其中,tornado

       controllers:爲頁面控制器模塊,放置全部業務handlers.裏面再按業務模塊分類,好比咱們這裏放置了主頁、密碼兩個模塊;ui

       static:爲靜態文件根目錄,放置圖片,css等靜態文件;url

       templates:模板文件的根目錄,放置全部的模板文件。裏面一樣再按業務模板進行細分,好比這裏細分出了密碼模塊的子文件夾。spa

       views:視圖模塊。主要爲一些跟頁面顯示有關的函數。好比自定義的模板方法(uiMethods)。debug

       採起分層的方式組織代碼,清晰明瞭,並且易於維護。

 

11.4 實現詳解

(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關鍵子去掉,結果以下:

image

相關文章
相關標籤/搜索