羅布大神最近準(zhǔn)備用python做網(wǎng)站,發(fā)現(xiàn)python在做網(wǎng)站方面還是比較原始的(相對于世界上最好的計算機語言),沒有session,出錯顯示不完善也就算了,web開發(fā)框架也是少?。ㄟ€是跟最好的語" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 用40行代碼寫python網(wǎng)頁模版渲染引擎

用40行代碼寫python網(wǎng)頁模版渲染引擎

時間:2023-06-11 13:09:01 | 來源:網(wǎng)站運營

時間:2023-06-11 13:09:01 來源:網(wǎng)站運營

用40行代碼寫python網(wǎng)頁模版渲染引擎:引子

羅布大神最近準(zhǔn)備用python做網(wǎng)站,發(fā)現(xiàn)python在做網(wǎng)站方面還是比較原始的(相對于世界上最好的計算機語言),沒有session,出錯顯示不完善也就算了,web開發(fā)框架也是少啊(還是跟最好的語言比 不是一個數(shù)量級)。最最重要的就是 在web框架上開發(fā)網(wǎng)站,學(xué)習(xí)難度陡峭,這樣小白們怎么吃得消,完全打亂了python簡單易學(xué)的規(guī)律,所以羅布大神決定自己開發(fā)一套簡單易學(xué)的web開發(fā)模式/框架,讓小白們學(xué)python web編程也如魚得水,把精力花在解決問題上,而不是學(xué)習(xí)什么狗屁框架上,我們知道框架的壽命只有三年左右,完全不值得我們把學(xué)習(xí)精力投資在框架上。

正文

首先我們知道,python做web頁面,肯定要把頁面/模版和業(yè)務(wù)邏輯分離,不能把業(yè)務(wù)代碼和html混在一起,就像下面一樣

#!/usr/bin/python# -*- coding: UTF-8 -*-print "Content-type:text/html"print # 空行,告訴服務(wù)器結(jié)束頭部print '<html>'print '<head>'print '<meta charset="utf-8">'print '<title>Hello World - 我的第一個 CGI 程序!</title>'print '</head>'print '<body>'print '<h2>Hello World! 我是來自菜鳥教程的第一CGI程序</h2>'print '</body>'print '</html>'看著就覺得很丑陋是不是,這也就講解下原理而已,真要實際做網(wǎng)頁,估計要累死半頭牛,絕對不能實戰(zhàn)的。俗話說,上帝的歸上帝,凱撒的歸凱撒,所以我們要把模版/html和業(yè)務(wù)邏輯/python分離開來,這樣勢必需要一套模版引擎,能把數(shù)據(jù)嵌套/替換到模版上去。 在這里羅布大神第一個想到的就是有木有現(xiàn)成的模版引擎可以用,我找呀找,dingo,flask我去太復(fù)雜了,有些人覺得容易,你覺得容易你去用呀,話說你給這些框架添加過一行代碼么?這些框架作者是你大爺?你咋這么向著他們,說話要客觀呀。反正我覺得是太難了。后來找到一個mustache的python版本,pystache。mustache是一個非常舒服的客戶端/js模版引擎,我以前用起來很爽的,建議做前端的同學(xué)們可以了解下,但是在python下,各種出錯,我要瘋了,麻煩作者稍微用點心吧,遂放棄,算了算了,自己擼起袖子來寫個模版引擎,話說我也是自稱大神的人。國內(nèi)自己寫模版引擎或者自己寫一門語言解析器的人不多吧,我弱弱的問一下。

開干

說干就干,首先想到的就是python自帶的字符串format函數(shù),在這里給大家看下例子,支持字典、列表、對象各種類型,有點接近我們的需求。大家先看看例子 ··· python2.6 開始,新增了一種格式化字符串的函數(shù) str.format(),它增強了字符串格式化的功能?;菊Z法是通過 {} 和 : 來代替以前的 % 。format 函數(shù)可以接受不限個參數(shù),位置可以不按順序。

>>>"{} {}".format("hello", "world") # 不設(shè)置指定位置,按默認(rèn)順序'hello world'>>> "{0} {1}".format("hello", "world") # 設(shè)置指定位置'hello world'>>> "{1} {0} {1}".format("hello", "world") # 設(shè)置指定位置'world hello world'#!/usr/bin/python# -*- coding: UTF-8 -*-print("網(wǎng)站名:{name}, 地址 {url}".format(name="菜鳥教程", url="www.runoob.com"))# 通過字典設(shè)置參數(shù)site = {"name": "菜鳥教程", "url": "www.runoob.com"}print("網(wǎng)站名:{name}, 地址 {url}".format(**site))# 通過列表索引設(shè)置參數(shù)my_list = ['菜鳥教程', 'www.runoob.com']print("網(wǎng)站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必須的怎么樣?看了這幾個列子,看的我熱血沖動,差點就撲上去,已經(jīng)很接近模版渲染引擎了 那么我們來寫模版吧:模版1 mb.html長這樣,是不是很清爽呀

<!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body> <h1>我的第一個標(biāo)題</h1> <p>網(wǎng)站名:{name}, 地址 {url}</p></body></html>程序怎么寫呢?

```#!/usr/bin/python# -*- coding: UTF-8 -*-#引入操作系統(tǒng)庫import os,sys#輸出頁面文件頭部print ("Content-type:text/html/n/n")#定義要傳給模版的數(shù)據(jù)site = {"name": "菜鳥教程", "url": "www.runoob.com"}#打開模版文件并讀取內(nèi)容file="mb.html"if os.path.exists(file) : f=open(file) str=f.read() f.close() #渲染:數(shù)據(jù)傳遞給模版 str=str.format(**site) #輸出給客戶端 print(str)好了,親們,注釋寫的清清楚楚,我們要用python自帶的字符串庫format就完成了模版的數(shù)據(jù)傳遞/渲染工作,但是不要高興的太早,format雖然好用,還差點意思,別人家的模版可以支持一般的循環(huán)渲染、條件渲染的。比如我要把

list1 = ['physics', 'chemistry', 1997, 2000]這樣的一個數(shù)組,甚至把一個表格list2 = [['physics', 'zhangsan', 1998, 2001], ['math', '', lisi, 2000] ['physics', 'wangwu', 1999, 2003]]渲染這樣的渲染要累死人的吧 渲染list模版要寫成,

str="{0[0]}, {0[1]}, {0[2]}, {0[3]}"然后用 str.format(list1)來渲染,list2的模版已經(jīng)復(fù)雜的我不想寫了,并且有時候你根本不知道list2里邊到底有幾組數(shù)據(jù),這時候模版根本沒辦法寫,所以模版要支持一定的邏輯才好,為此,我們需要寫一個更牛的format,也就是我標(biāo)題寫的自己寫個模版引擎啦,蛤~,原來你說的模版引擎就是format,沒錯,嗯,不過要深加工下format,format做模版引擎還差點意思的,讓我們來定義個函數(shù),擴展format,就叫supformat吧,顧名思義,就是超級format 引入 {for 變量} 內(nèi)容 {/for} 來執(zhí)行循環(huán)和條件,如果變量為列表 內(nèi)容會被列表的每個元素重復(fù)渲染,如果變量不存在,內(nèi)容不會被渲染,如果變量不是列表 但存在,變量會被正常渲染,看說明應(yīng)當(dāng)一點都不繞口吧,蛤~

#!/usr/bin/python# -*- coding: UTF-8 -*-#str:模版字符串 list1:傳入的數(shù)據(jù),可以是字典、列表、對象def supformat(str,list1): pos=str.find("{for ") if pos>=0: # print(pos) posend=str.find("{/for}",pos) if posend<0: print("need a {/for}") return ""; prestr=str[0:pos] endstr=str[posend+6:] keypos=str.find("}",pos) listkey=str[pos+5:keypos] str=str[keypos+1:posend] #print listkey,str if list1.has_key(listkey) : #如果變量不存在,內(nèi)容不會被選擇 mlist=list1[listkey] if type(mlist)==list : #如果變量存在 會被渲染 c=len(mlist) tmp="" for i in xrange(c): tmp+=supformat(str,mlist[i])#str.format(mlist[i]) # print str, mlist[i] str=tmp elif mlist: #判斷true or false #如果變量不是列表 但存在,變量會被正常渲染 str=supformat(str,mlist)#str.format(list['listkey']) else: #如果變量為0或者false 不會被渲染 str="" else: #如果變量不存在,內(nèi)容不會被渲染 str="" str=supformat(prestr,list1)+str+supformat(endstr,list1) #支持遞歸渲染 else: # 檢查是否字典 if type(list1)==dict : str=str.format(**list1) #字典渲染方式 else : str=str.format(list1) #非字典渲染方式 return str這個模版引擎寫好了,怎么樣,是不是沒有想想的那么復(fù)雜,老祖宗說的好“天下事有難易乎?為則難者亦易矣”,非常鼓勵我們自己的程序員寫自己的模版引擎,寫自己的框架,發(fā)明自己的計算機語言,整天你們叫嚷著別人寫的這個框架好,別人發(fā)明的那個好,跟你你什么關(guān)系,自己寫的也就算了,為別人寫的東西你們互相奚落,還發(fā)明了鄙視鏈,害不害臊呀? 好了,我們言歸正傳,看看這個函數(shù)怎么用,假設(shè)我們把這個函數(shù)保存在一個supformat.py的文件里,那么使用的時候,要保證這個文件在當(dāng)前目錄或者sys.path的目錄列表里,然后就引入就可以使用了,

#!/usr/bin/python# -*- coding: UTF-8 -*-#引入操作系統(tǒng)庫import os,sysimport supformat as sp #引入supformat函數(shù)#輸出頁面文件頭部print ("Content-type:text/html/n/n")#定義要傳給模版的數(shù)據(jù)list2 = [['physics', 'zhangsan', 1998, 2001], ['math', '', lisi, 2000] ['physics', 'wangwu', 1999, 2003]]site={"list2":list2}#打開模版文件并讀取內(nèi)容file="mb.html"if os.path.exists(file) : f=open(file) str=f.read() f.close() #渲染:數(shù)據(jù)傳遞給模版 str=supformat(site) # **劃重點 模版渲染使用方法** #輸出給客戶端 print(str)模版如下

{for list2} {} {} {} {}{/for}怎么樣,模版是不是很清爽,另外要說下 模版里邊需要用大括號的地方要用雙大括號轉(zhuǎn)義 樣式表和js的大括號要寫成 {{}}

好了,羅布大神寫的web渲染模版引擎就到這里,你也可以直接拿來用,或者對你寫自己的程序有所啟發(fā),大家如果要學(xué)習(xí)python也可以來咨詢我,可以關(guān)注微信: 預(yù)約貓 然后輸入羅布大神 就會有我的聯(lián)系方式哦



關(guān)鍵詞:渲染,引擎

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉