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