1. 程式人生 > >flask 的模板

flask 的模板

模板

個人拙見:所謂模板就是就是模具,模型;我們現實生活中經常碰到這種東西,就比如說廠家要批量生產一種鋼化杯子,那麼廠家肯定是先建模,設計出一個杯子的模型,並在此基礎上做出模具,之後的生產,只需要將冶煉好的金屬注入其中即可。我們學習的模板就類似於這種模具,只不過我們這裡的是 web 模板。模板的誕生是為了將顯示與資料分離,讓前端工作人員專注表現設計,後臺人員注重業務邏輯,同時簡化程式碼的複雜程度。模板技術多種多樣,但其本質是將模板檔案和資料通過模板引擎生成最終的HTML程式碼。

渲染模板

所謂渲染模板,其實就是將資料插入到你的模板中,例如:

這是一個 user.html的檔案

<h1
>
Hello, {{ name }}!</h1>

這是一個檢視函式

from flask import Flask,render_template

@app.route('/user/<name>')
def user(name):
    return render_template('user.html',name=name)

flask 提供的 render_template 函式將 Jinja2 模板引擎整合到了程式中。render_template 函式第一個引數是模板的檔名。隨後的引數都是鍵值對,表示模板中變數對應的真實值,注意一下,這個 render_template 查詢響應檔案是有位置的,預設的是在當前指令碼的同級目錄的templates目錄下,如果不是這個目錄下的檔案是查詢不到的,需另行修改。(如圖所示,我的檢視函式在 manage 中,而我的響應檔案則儲存在 templates 中)
這裡寫圖片描述


拿上面這個例子來舉例,首先在 user.html 檔案中有一個變數name,user這個函式的形參中也有一個變數 name 在響應的時候會將 user.html 中的name替換為user函式所接收到的引數,打個比方,如果訪問的是’/user/tom’,那麼這個時候,user.html 的顯示效果就是 Hello,tom!

變數

上面的例子提到了變數,在模板中使用 {{ name }} 結構表示一個變數,它是一種特殊的佔位符,告訴模板引擎這個地方要被替換為渲染時傳遞過來的資料。Jinja2 能識別所有型別的變數,例如列表,字典,物件等,例子見下:

<p>A value from a dirctionary: 
{{ mydict['key'] }}.</p> <p>A value from a list: {{ mylist[2] }}.</p> <p>A value from a list,with a variable index: {{ mylist[myintvar] }}.</p> <p>A value from an object's method: {{ myobj.somemethod() }}.</p>

還可以使用過濾器修改變數,過濾器名新增在變數名之後,與變數名之間用豎線分隔。如下,為模板以首字母大寫形式顯示變數 name 的值

hello, {{ name|capitalize }}

Jinja2的常用過濾器

過濾器名 說明
safe 渲染時不轉義
capitalize 把值的首字母轉換成大寫,其他字母轉為小寫
lower 把值轉換為小寫
upper 把值轉換為大寫
title 把值中每個單詞首字母轉換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前,把值中所有的HTML標籤都刪掉

safe 過濾器需要注意一下,預設情況下,出於安全考慮,Jinja2 會轉義所有的變數。如果需要顯示變數中儲存的原始碼時,就可以考慮使用 safe 過濾器了。但需要切記的是,千萬不可在不可信的值上使用 safe 過濾器,例如使用者在表單輸入的文字等。

控制結構

Jinja2提供了多種控制結構,可用來改變模板的渲染流程。語法:{% 語句 %} 具體例子見下:
條件控制語句:

{% if user %}
    Hello ,{{ user }}!
{% else %}
    Hello ,Stranger!
{% endif %}

迴圈控制:

<ul>
    {% for comment iin comments %}
        <li>{{ comment }}</li>
    {% endfor %}
</ul>

Jinja2 還支援巨集,類似於Python程式碼中的函式(本人還不是很理解,待續)

藍圖

一個功能完善的網站的目錄結構是較為複雜的,這會給我們在處理響應的時候帶來很大的麻煩,但有一個強大的工具讓這個問題變的簡單了,沒錯,就是藍圖。那麼什麼是藍圖呢?彆著急,先看一個例子:
目錄結構
這是本人的一個專案目錄結構,當然這只是其中一部分(其他無關緊要),admin 是後臺,home 為前臺;他們響應的 html 檔案分別存在於 templates 下的 admin 和 home 中,但是大家看一下我的檢視函式。

admin的 views
這裡寫圖片描述

home 的 views
這裡寫圖片描述

大家發現了沒,我給兩個函式的路由是一樣的,但明顯前後端的路由不可能會一樣(並不是本人寫錯了 / 笑哭),這是怎麼實現的呢?這就是藍圖的功效,ta 可以把整個目錄結構分而治之,而且各個部分直接不會相互產生干擾,趕緊來看一下怎麼做到的吧(這裡用 admin 的進行舉例)。

  • 定義一個藍圖
    這裡寫圖片描述
  • 註冊藍圖
    這裡寫圖片描述
  • 使用藍圖進行路由
    這裡寫圖片描述

因為我們在註冊的時候給了一個地址 url_prefix=”/admin” ,其實對後臺進行請求時的路由地址應該是由兩個地址拼接起來的 “ /admin/ ”。

未完待續

宣告:本文乃是本人學習筆記,很多內容來自於 Grinberg 的《Flask web 開發》