第三章 模版層

2022-06-11 07:09:09 字數 4539 閱讀 1874

每乙個web框架都需要一種很便利的方法用於動態生成html頁面。 最常見的做法是使用模板。

模板包含所需html頁面的靜態部分,以及一些特殊的模版語法,用於將動態內容插入靜態部分。

說白了,模板層就是如何往html檔案中填入動態內容的系統。

django可以配置乙個或多個模板引擎(語言),也可以不用引擎。

django自帶乙個稱為dtl(django template language )的模板語言,以及另外一種流行的jinja2語言(需要提前安裝,pip install jinja2)。

django為載入和渲染模板定義了一套標準的api,與具體的後台無關。載入指的是,根據給定的模版名稱找到的模板然後預處理,通常會將它編譯好放在記憶體中。渲染則表示,使用context資料對模板插值並返回生成的字串。

dtl作為django原生的模板系統,一直到django1.8,都是唯一的內建模版系統,可能你對它有些意見,但是它仍然是乙個優秀的模版庫。如果沒有特別重要的理由,需要選擇另外一種模版系統的話,建議堅持使用dtl,特別是在編寫可插拔的應用並打算發布其模板的時候。django很多內部元件都使用了dtl,例如django.contrib.admin,如果你不想讓它們罷工,或者花費大力氣進行修改,不要放棄dtl。

模板引擎通過settings中的templates設定來配置。這是乙個列表,與引擎一一對應,每個元素都是乙個引擎配置字典。由startproject命令生成的settings.py會自定定義如下的值:

templates = [,},

]

backend:後端。內建的後端有django.template.backends.django.djangotemplatesdjango.template.backends.jinja2.jinja2

options中包含了具體的後端設定。

由於絕大多數引擎都是從檔案載入模板的,所以每種模板引擎都包含兩項通用設定:

每種模板引擎後端都定義了乙個慣用的名稱作為應用內部存放模板的子目錄名稱。(例如django為它自己的模板引擎指定的是 『templates』,為jinja2指定的名字是『jinja2』)。尤其是,django允許你有多個模板引擎後端例項,且每個例項有不同的配置選項。 在這種情況下你必須為每個配置指定乙個唯一的name .

dtl引擎的options配置項中接受以下引數:

django.template.loader中定義了兩個函式以載入模板。

get_template(template_name,using = none)[source]

該函式使用給定的名稱查詢和載入模板,並返回乙個template物件。

模板的查詢和載入機制取決於每種後端引擎和配置,如果想使用指定的模板引擎進行查詢,請將模板引擎的name賦給get_template的using引數。

select_template(template_name_list,using = none)[source]

和get_template()相似, 只不過它使用包含模板名稱的列表作為引數。

select_template()get_template()返回的template物件都必須提供乙個render()方法,如下所示:

template.render(context=none, request=none)

通過給定的context對該模板進行渲染。

如果提供了context,那麼它必須是乙個dict物件。如果要提供request引數 ,必須使用httprequest物件。

針對下面的templates配置,對模版檔案的搜尋順序和路徑如下:

templates = [,,

]

如果你呼叫函式get_template('story_detail.html'), django將按以下順序查詢story_detail.html

/home/html/example.com/story_detail.html('django'引擎)

/home/html/default/story_detail.html('django'引擎)

/home/html/jinja2/story_detail.html('jinja2'引擎)

如果你呼叫函式select_template(['story_253_detail.html','story_detail.html']),django按以下順序查詢:

/home/html/example.com/story_253_detail.html('django'引擎)

/home/html/default/story_253_detail.html('django'引擎)

/home/html/jinja2/story_253_detail.html('jinja2'引擎)

/home/html/example.com/story_detail.html('django'引擎)

/home/html/default/story_detail.html('django'引擎)

/home/html/jinja2/story_detail.html('jinja2'引擎)

注意:django查詢到任何乙個匹配的模板後便停止搜尋,所以這是個類似url搜尋的短路操作!

要在乙個子目錄內載入模板,像下面這樣:

get_template('news/story_detail.html')
如果結合上面例子中的templates配置,這將會嘗試按順序查詢並載入下列模板︰

/home/html/example.com/news/story_detail.html('django'引擎)

/home/html/default/news/story_detail.html('django'引擎)

/home/html/jinja2/news/story_detail.html('jinja2'引擎)

另外,為了減少載入模板、渲染模板等重複工作,django提供了處理這些工作的快捷函式。

render_to_string(template_name, context=none, request=none, using=none)[source]

render_to_string()會像get_template()一樣載入模板並立即呼叫render()方法。 它需要以下引數。

用法示例:

from django.template.loader import render_to_string

rendered = render_to_string('my_template.html', )

以後,如果沒有特別強調,都是針對dtl引擎。

django模板語言的語法包括四種結構。

變數的值來自context中的資料字典, 類似於字典物件的keys到values的對映關係。

變數是被}}}. my last name is }.假如有乙個上下文,模板渲染後的真實值為:

my first name is john. my last name is doe.
字典查詢,屬性查詢和列表索引查詢都是通過圓點符號.來實現。所以圓點在模版引擎中是萬能的上帝,不知道該怎麼寫下去的時候,就嘗試點點點....:

}

}}

模版語言中的標籤類似python中的函式,功能多樣,使用靈活。可以輸出內容、控制結構,甚至可以訪問其他的模板標籤。

標籤是由%}# csrf令牌標籤大部分標籤都接受引數:

# 迴圈使用'odd'和'even'
部分標籤需要使用起始和閉合標籤,典型代表為for迴圈標籤和if判斷標籤:

hello, }.
過濾器用於修改變數或標籤引數的值。例如下面這樣:

}
如果有乙個上下文,那麼模板最終呈現:

the web framework for perfectionists with deadlines # 所有的單詞首字母大寫了
有些過濾器還接收乙個引數:

} # 按指定的格式"y-m-d",顯示日期
模版語言的注釋看起來像這樣:

# 單行注釋
標籤提供多行注釋功能。

多行注釋起始: 多行注釋結尾:

第三章 傳輸層

傳輸層是為應用層提供傳輸服務的 端到端指的就是從這個應用程式到那個應用程式。多路復用和多路分解 是傳輸層的一項基本功能,支援眾多應用程序共用同乙個傳輸層協議,並能夠將接收到的資料準確交付給不同的應用程序。tcp套接字 標識一條tcp連線 源ip位址,源埠號,目的ip位址,目的埠號 當乙個tcp報文端...

第三章 模版層 5 人類可讀性

一些django的 奇技淫巧 就存在於這些不起眼的地方。為了提高模板系統對人類的友好性,django在django.contrib.humanize中提供了一系列的模板過濾器,有助於為資料展示新增 人文關懷 對於數字1 9,返回英文單詞,否則返回數字本身。這遵循了出版圖書的格式。例如 可以傳遞整數,...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...