Python實(shí)戰(zhàn)【第二節(jié)】在網(wǎng)頁(yè)上顯示信息
歡迎大家來(lái)到Python自學(xué)教程實(shí)戰(zhàn)篇,上一講我們跟大家聊了聊我們本次實(shí)戰(zhàn)的主題和目的,并且給大家了一串代碼讓大家試驗(yàn)一下,不知道大家都有沒(méi)有做呢?這節(jié)課我們就先來(lái)解釋下昨天文章中的那串代碼:
import web
導(dǎo)入 web.py 模塊。
urls = ( '/', 'index' )
這是指定網(wǎng)站 url 的匹配規(guī)則,左邊是正則表達(dá)式,右邊是對(duì)應(yīng)處理函數(shù)的名稱(chēng)。
class index: def GET(self): return "Hello, world!"
這便是處理請(qǐng)求的函數(shù) index。GET 和 POST 是 HTTP 的兩種請(qǐng)求方式,一般來(lái)說(shuō),GET 用于請(qǐng)求網(wǎng)頁(yè),而 POST 多用于提交表單。舉個(gè)不嚴(yán)謹(jǐn)?shù)睦踝樱寒?dāng)你在瀏覽器地址欄中輸入一個(gè)地址并按下回車(chē),就是發(fā)送了一個(gè) GET 請(qǐng)求;而當(dāng)你在打開(kāi)的頁(yè)面中輸入用戶(hù)名和密碼,點(diǎn)擊登錄按鈕,則是發(fā)送了一個(gè) POST 請(qǐng)求。這里的 GET 函數(shù)描述了對(duì)于一個(gè) GET 請(qǐng)求的處理方式:直接返回一個(gè)字符串。
if __name__ == "__main__": app = web.application(urls, globals()) app.run()
最后,當(dāng)這個(gè)代碼文件被執(zhí)行時(shí),我們將創(chuàng)建一個(gè) application,它會(huì)按照我們定義的 url 規(guī)則進(jìn)行對(duì)應(yīng)的處理,并在后臺(tái)一直運(yùn)行,獨(dú)自等待請(qǐng)求的到來(lái)。
插一句:由于這個(gè)系列的文章側(cè)重于“實(shí)戰(zhàn)”,所以我只會(huì)搬開(kāi)擋在道路正前方的石頭,對(duì)于涉及的諸多細(xì)節(jié)無(wú)法面面俱到。即使這段簡(jiǎn)單的 hello world 代碼中,關(guān)于 url 的正則匹配、GET / POST 的區(qū)別等,都可說(shuō)上很多。但現(xiàn)在我只能略過(guò)。如有疑問(wèn),歡迎在QQ群和論壇上討論。
僅僅在頁(yè)面上顯示 hello world 顯然不能滿(mǎn)足我的需求。我是想要一個(gè)關(guān)于電影的網(wǎng)站,那最起碼得在頁(yè)面上顯示一些電影的信息吧。
一種顯而易見(jiàn)的方法是,把要顯示的信息拼成字符串,然后返回。
在代碼里定義一組數(shù)據(jù),一個(gè)由 dict 組成的 list:
movies = [ { 'title': 'Forrest Gump', 'year': 1994, }, { 'title': 'Titanic', 'year': 1997, }, ]
然后把 GET 方法改為:
def GET(self): page = '' for m in movies: page += '%s (%d)\n' % (m['title'], m['year']) return page
movies 是一個(gè)包含了影片標(biāo)題和年代信息的 list。在 GET 方法中,把 movies 里每一條內(nèi)容取出來(lái),拼接成一整個(gè)字符串,作為結(jié)果返回。
如果你之前已經(jīng)運(yùn)行了 code.py,刷新頁(yè)面將會(huì)看到新的內(nèi)容:
Forrest Gump (1994) Titanic (1997)
是不是有點(diǎn)類(lèi)似在命令行輸出結(jié)果或者在文本文件中存儲(chǔ)內(nèi)容?但作為一個(gè)網(wǎng)頁(yè),如果以后要添加更多的顯示效果和交互功能,這樣寫(xiě)肯定是要跪。好在 web.py 給我們提供了一種更方便的頁(yè)面展示方式 -- 模板。
剛才我們用的方法類(lèi)似于在 Python 里寫(xiě) HTML,這是比較痛苦的。而 web.py 的模板是讓你能在 HTML 里寫(xiě) Python。
首先我們需要在代碼里指定模板:
render = web.template.render('templates/')
在 GET 方法里調(diào)用模板:
def GET(self): return render.index()
模板的返回值就是一個(gè)處理好的頁(yè)面,所以直接 return 就可以了。
然后在項(xiàng)目文件夾,也就是 code.py 所在的目錄下新建一個(gè)叫做 templates 的目錄,里面新建一個(gè) index.html 文件作為模板。注意這里的 templates、index 命名都需要與你代碼里的設(shè)定一致。如果你是吧一個(gè) muban 文件夾下的 shouye.html 作為模板,那相應(yīng)代碼就應(yīng)改為:
render = web.template.render('muban/') render.shouye()
在模板 index.html 里寫(xiě)下:
<h1>Crossin's Movie Site</h1>
h1 是 HTML 中表示標(biāo)題的標(biāo)簽。保存 code.py 和 index.html 后刷新頁(yè)面,你將會(huì)看到一行很大的標(biāo)題:
Crossin's Movie Site
這表示模板已經(jīng)生效了。但 movies 的信息仍然沒(méi)有顯示。如果需要在模板中顯示信息,需要將信息傳遞給模板:
def GET(self): return render.index(movies)
然后在模板里,接收并使用傳遞進(jìn)來(lái)的參數(shù):
$def with (movies) <h1>Crossin's Movie Site</h1> $movies
web.py 模板中的 $def with 表示這個(gè)模板中將要使用的變量。注意務(wù)必把它放在模板的第一行。如果有多個(gè)參數(shù),需要全部依次列在括號(hào)中。
$movies 則表示獲取 movies 變量的值。
保存刷新,頁(yè)面上已經(jīng)可以看到我們?cè)诖a中定義的 movies 信息了,但還是 list 直接轉(zhuǎn)換字符串的效果。
更近一步地,我們可以在模板中對(duì)數(shù)據(jù)進(jìn)行操作,讓它們看起來(lái)更順眼一點(diǎn):
$for movie in movies: <li> $movie['title'], $movie['year'] </li>
模板中的語(yǔ)法和 Python 類(lèi)似,只是前面需要增加 $ 符號(hào)。縮進(jìn)依然需要按照 Python 中的規(guī)范。li 是 HTML 中列表的標(biāo)簽。
這時(shí)候,頁(yè)面上已經(jīng)就能以列表的形式顯示電影信息了。盡管依然簡(jiǎn)陋,但一切才剛剛開(kāi)始,我們的征途是星辰大海。
恭喜您在Python自學(xué)的道路上又堅(jiān)持了一天,我們目前學(xué)習(xí)的知識(shí)比之前的要復(fù)雜一些,但是也比之前的有趣多了,所以希望大家跟上我們的步伐,繼續(xù)加油!
好啦,今天的分享到這里就結(jié)束了,希望大家持續(xù)關(guān)注馬哥教育官網(wǎng),每天都會(huì)有大量?jī)?yōu)質(zhì)內(nèi)容與大家分享!
聲明:文章來(lái)源于網(wǎng)絡(luò),侵刪!