web框架把我們從wsgi中拯救出來了。現在,我們只需要不斷地編寫函式,帶上url,就可以繼續web app的開發了
但是,web app不僅僅是處理邏輯,展示給使用者的頁面也非常重要。在函式中返回乙個包含html的字串,簡單的頁面還可以,但是,想想新浪首頁的6000多行的html,你確信能在python的字串中正確地寫出來麼?反正我是做不到。
俗話說得好,不懂前端的python工程師不是好的產品經理。有web開發經驗的同學都明白,web app最複雜的部分就在html頁面。html不僅要正確,還要通過css美化,再加上覆雜的j**ascript指令碼來實現各種互動和動畫效果。總之,生成html頁面的難度很大。
由於在python**裡拼字串是不現實的,所以,模板技術出現了。
使用模板,我們需要預先準備乙個html文件,這個html文件不是普通的html,而是嵌入了一些變數和指令,然後,根據我們傳入的資料,替換後,得到最終的html,傳送給使用者:
這就是傳說中的mvc:model-view-controller,中文名「模型-檢視-控制器」。
python處理url的函式就是c:controller,controller負責業務邏輯,比如檢查使用者名稱是否存在,取出使用者資訊等等;
包含變數}的模板就是v:view,view負責顯示邏輯,通過簡單地替換一些變數,view最終輸出的www.cppcns.com就是使用者看到的html。
mvc中的model在哪?model是用來傳給view的,這樣view在替換變數的時候,就可以從model中取出相應的資料。
上面的例子中,model就是乙個dict:
只是因為python支援關鍵字引數,很多web框架允許傳入關鍵字引數,然後,在框架內部組裝出乙個dict作為model。
現在,我們把上次直接輸出字串作為html的例子用高階大氣上檔次的mvc模式改寫一下:
from flask import flask, request, render_template
app = flask(__name__)
@app.route('/', methods=['get', 'post'])
def home():
return render_template('home.html')
@app.route('/signin', methods=['get'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['post'])
def signin():
username = request.form['username']
password = request.form['password']
if username=='admin' and password=='password':
return render_template('signin-ok.html', username=username)
return render_template('form.html', message='bad username or password程式設計客棧', username=username)
if __name__ == '__main__':
app.run()
flask通過render_template()函式來實現模板的渲染。和web框架類似,python的模板也有很多種。flask預設支援的模板是jinja2,所以我們先直接安裝jinja2:
$ easy_install jinja2
然後,開始編寫jinja2模板:
home.html
用來顯示首頁的模板:
home
form.html
用來顯示登入表單的模板:
please sign in }
signin-ok.html
登入成功的模板:
welcome, }
welcome, }!
登入失敗的模板呢?我們在form.html中加了一點條件判斷,把form.html重用為登入失敗的模板。
最後,一定要把模板放到正確的templates目錄下,templates和app.py在同級目錄下:
啟動python app.py,看看使用模板的頁面效果:
通過mvc,我們在python**中處理m:model和c:controller,而v:view是通過模板處理的,這樣,我們就成功地把python**和html**最大限度地分離了。
使用模板的另一大好處是,模板改起來很方便,而且,改完儲存後,重新整理瀏覽器就能看到最新的效果,這對於除錯html、css和j**ascript的前端工程師來說實在是太重要了。
在jinja2模板中,我們用}表示乙個需要替換的變數。很多時候,還需要迴圈、條件判斷等指令語句,在jinja2中,用表示指令。
比如迴圈輸出頁碼:
}如果page_list是乙個list:[1, 2, 3, 4, 5],上面的模板將輸出5個超連結。
除了jinja2,常見的模板還有:
小結有了mvc,我們就分離了python**和html**。html**全部放到模板裡,寫起來更有效率。
本文標題: 在python中使用html模版的教程
本文位址:
在HTML中使用SVG
如何在html中顯示 svg?有四種方式能夠在html 中顯示svg 第一種 embed 標籤這種標籤被所有主流的瀏覽器支援,而且優點是支援指令碼使用。這種標籤是adobe svg viewer 所倡導的使用方法,但是它不是 xhtml 的規範。語法為 例項 svg檔名稱為a.svg,如下 html...
在HTML中使用WCF RESTful上傳檔案
在html中上傳檔案時會為檔案內容加入一頭一尾,使用瀏覽器自帶的除錯工具可看到請求頭中有request payload資料如下所示 8cc0b8cfcfd5ed2 content disposition form data name file filename item3.xml 這裡是真正的檔案內...
在html中使用vue元件
最近在維護公司的專案,當我拿到專案時,發現他用了vue。但是 僅僅是引用vue.js檔案,整體的架構還是html那種,沒有用webpack!當時覺得 哇 原來還可以這樣!然後了解了業務邏輯和 邏輯,覺得這個人寫的 emmm 沒辦法只能按照之前的思路去寫 開發新頁面時,我就引用了vue的元件 上個人僅...