head_first_python對CGI的探討

接着上面講,在head first這本書當中,採用的例子是人物問答的形式,你首先要想想自己的webapp看上去是什麼樣子,另外在web瀏覽器上是什麼樣子,這有助於幫助你明白你的webapp需要做些什麼。

這裏按照書上的例子來,kelly教練希望能夠有一個漂亮友好的主頁,兩個小朋友希望能夠輕鬆得到他們的運動數據(這是書上一個貫徹全書的例子),另外這些數據應該漂亮的呈現給用戶。

這樣我們就可以簡單的對我們的web進行設計:一個歡迎頁面,一個選擇選手的頁面,以及一個顯示時間的頁面。

既然已經明白你的構建,那麼我們下一個需要思考的問題就是如何實現我們的設計?用什麼方法?問不同的人也許你會得到不同的回答,但是一般來講,我們都會遵循mvc模式,即model_view_controller(模型_視圖_控制器)模式,這有助於將web設計分成易於管理的功能模塊。這樣,當需要改變的時候,我們可以很輕鬆的實現擴展,同時,作爲一個團隊,我們也可以更簡單的實現任務的分配,儘管這裏我們實現的只是簡單的任務,但是這種思想的貫徹對我們將來的team生活是有極大的幫助的!

至於什麼是模型,視圖,我們在實踐中去理解,給出定義。

按照上面的步驟,我們首先是模型部件,書本上首先是爲數據建模,而書本上模型給出的定義是存儲(以及有時處理)web應用數據的代碼。這裏web服務器需要存儲數據的一個副本,在這裏數據就是kelly教練的計時值(來自他的文本文件),啓動這個webapp時,我們首先需要把文本文件當中的AthleteList對象實例,存儲在一個字典當中,然後保存爲一個pickle文件,下面自動把這個功能封裝在put_to_store()的新函數當中,暫時我也對pickle這種存在的意義不是很理解,畢竟沒有使用過,也不知道它的幫助,但是我們知道它可以作爲文件,這就足夠了。

當這個webapp運行時,pickle文件中的數據可以作爲一個字典供使用,下面把這個數據提取過程封裝在get_from_store()函數當中,

import pickle
from athletelist import AthleteList
def get_coach_data(filename):
    try:
        with open(filename) as f:
            data=f.readline()
        temp1=data.strip().split(",")
        return(AthleteList(temp1.pop(0),temp1.pop(0),temp1))
    except IOError as ioerr:
        print('file error: '+str(ioerr))
        return(None)
def put_to_store(files_list):
    all_athletes={}
    for each_file in files_list:
        ath=get_coach_data(each_file)
        all_athletes[ath.name]=ath
    try:
        with open("athletes.pickle","wb") as athf:
            pickle.dump(all_athletes,athf)
    except IOError as ioerr:
        print("'file error(put_and_store):"+str(ioerr))
    return(all_athletes)
def get_from_store():
    all_athletes={}
    try:
        with open("athletes.pickle","rb") as athf:
            all_athletes=pickle.load(athf)
    except IOError as ioerr:
        print('file error(get_from_store):'+str(ioerr))
    return(all_athletes)

而athletelist的代碼如下:

#head_first_python
class AthleteList(list):
    def __init__(self,a_name,a_dob=None,a_times=[]):
        list.__init__([])
        self.name=a_name
        self.dob=a_dob
        self.extend(a_times)
    def top3(self):
        return(sorted(set([sanitize(t) for t in self]))[0:3])
def sanitize(time_string):
    if "-" in time_string:
        splitter="-"
    if ":" in time_string:
        splitter=":"
    else:
        return(time_string)
    (mins,secs)=time_string.split(splitter)
    return(mins+"."+secs)

此時回過頭來看這個pickle,雖然還是很陌生,但是我們卻可以發現它把變量對象直接存儲在pickle文件中,讀取時可以直接使用,這就可以方便我們使用而不用再去把值存儲在新的變量當中,特別是某些情況下這種操作可能特別繁瑣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章