標籤:blog http io os 使用 ar java for strong
這個周末玩了玩Google App Engine,隨手寫點東西,算是學習筆記吧。不當之處,請多多指正。
liigo,2009/04/26夜,大連
原創連結:http://blog.csdn.net/liigo/archive/2009/04/26/4127055.aspx
轉載請註明出處:http://blog.csdn.net/liigo
一,怎麼想起來玩Google App Engine了呢?
近期想寫一個小程式,以便在公司的電腦和家裡的電腦之間隨時共用資料。但是沒有現成的server和虛擬機器主機,資料存在哪裡就成了問題。為了這個小東西去專門租一個虛擬機器主機嗎,似乎不值得。而Google App Engine (GAE)同意使用者在GOOGLE的server上免費部署WEB應用程式,自然而然的滿足了我的需求。
二,什麼是Google App Engine?
嚴格的定義去官方網站(http://code.google.com/intl/en/appengine/)找吧,我(liigo)通俗的理解為,它是一個相似虛擬機器主機的東西,同意你把寫好的WEB應用程式(WEB網站),部署在它的server上。舉個範例吧,如今網路上到處都有提供“PHP + MySQL”和“ASP + SQLServer”虛擬機器主機服務的吧,一般每年收費從幾百元到成千上萬元的都有;而Google App Engine則相當於給你免費提供“Python + Datastore”和“Java Servlet/JSP + Datastore”虛擬機器主機服務(Datastore是GOOGLE提供的資料庫,The App Engine datastore is a schemaless object datastore, with a query engine and atomic transactions.)。我們的程式跑在GOOGLE的server上,使用GOOGLE的CPU和頻寬,享受GOOGLE優秀網路架構下的安全性、靈活性、延展性和負載平衡。Google App Engine為每一個程式免費提供500M儲存空間,充足的CPU(每日最高46CPU-hours)和頻寬(每日最高上傳下載流量各10G),以及每月500萬點擊量,足夠應付大多數項目需求(必要時還能夠付費擴充);而提供等值效能的普通虛擬機器主機,則價格不菲。眼下Google App Engine僅僅支援Python和Java,計劃中將支援其他程式設計語言(PHP, Ruby, Perl, ASP, ESP?)。我(liigo)個人以為,Google App Engine前途不可限量,將逐步蠶食眼下的虛擬機器主機(virtual hosts)市場。眼下它的劣勢是,僅僅支援Python和Java,而這兩者顯然不是WEB開發的首選。
三,Python,還是Java?
Google App Engine眼下僅僅支援Python和Java,這是個二選一的問題。從對程式設計語言的瞭解上,我應該選Java,可是考慮到開發的高速和便捷,我終於還是選擇了我不怎麼熟悉(甚至一度排斥)的Python。拿Java寫WEB,就象拿易語言寫server一樣,未必是最好的選擇。
四,Google App Engine之旅
照著新手教程一步步的來,剛開始進展順利,非常快就成功的部署了第一個程式,開心啊。
四.1 app.yaml *.py 等檔案都能夠即時改動即時生效,不用重新啟動WEBserver,非常好。
四.2 庫路徑,好累啊。在接觸到WebApp(以及後來的webob, cgi)時卡住了,報告“ImportError”錯誤,似乎是找不到對應的Python庫(哈哈,我還以為僅僅有易語言會提示“無法載入支援庫”呢),搜尋了半天,總算通過設定系統內容變數PYTHONPATH攻克了,其值為:
D:/Python25/Lib;D:/Program Files/Google/google_appengine;D:/Program Files/Google/google_appengine/lib/webob
我以為這是Google App Engine Python SDK安裝包的疏忽,沒有正確的設定相關庫路徑,害剛開始學習的人們卡殼了半天。要說Java的classpath剛開始學習的人難以理解,Python的PYTHONPATH, sys.path也好不哪裡去,還別說,EF不是照樣引入了EF_LIB_PATHS嘛。說多了。
四.3 不能在類定義之前使用它。WebApp最核心的一句代碼:
application = webapp.WSGIApplication([(‘/index‘, MainPage)], debug=True)
我特意試了一下,把類MainPage的定義移到這一行以下,天啊,出來滿屏的錯誤,嚇得我又改回去了。可見儘管是指令碼語言,也不能隨著性子來。可是我真的希望把這一行寫在源檔案的最前面,由於這裡集中了整個程式的結構。
四.4 URL中的字母是區分大寫和小寫。比如:http://localhost:8080/index 寫成 .../Index 就不行了,這一點不太好,應該改正。
四.5 Python格式化文本的文法,又卡住我半天。常式裡有這麼一句 write("%s" % a),我想再加一個"%s",嘗試了各種文法,write("%s%s" % a % b),write("%s%s", a,b) 等等,深受折磨,偏偏Google也來折磨我,不同意我搜尋"python %s"keyword,後來通過搜尋"python format string"才找到正確答案:write("%s%s" %(a,b))。呵呵,探索的快樂。
四.6 文本轉整數,用 int() 函數。依據某個id刪除一個貼子,首先得到的是id的文本形式(self.request.get(‘id‘)),要先轉成整數後再去資料庫尋找相應的記錄(db.Model.get_by_id())。對python語言不熟啊,要搜尋半天才找到int()這個函數。C/C++的話,我知道用atoi();Java的話,我知道用Integer.parseInt();Delphi的話,我知道用strtoint();易語言的話,我知道用"到整數()";EF的話,我知道用"文本類.到整數()";可是python的話,我要搜尋半天才幹找到int()。
四.7 Google的資料庫Datastore。它不是傳統的關係型資料庫,而是對象型資料庫;它不支援標準的SQL,但有相似的GQL。在python裡使用的話:要先定義一個繼承自db.Model的類(MyModel),指定各成員屬性,相當於定義表結構(欄位及其類型)吧;查詢時,通過 db.GqlQuery() 構造一個GqlQuery對象(可當作MyModel對象的集合使用,如 for ... in,GQL中"select from xxx"裡的"xxx",就是MyModel類的類名稱"MyModel"),或通過調用類方法MyModel.gql()返回GqlQuery對象(此時GQL中不須要"select from xxx"部分了);插入時,先執行個體化出一個MyModel對象,對其各成員賦值,然後調用該對象的put();改動時,對MyModel對象指定成員賦值,再調用put();刪除時,調用MyModel類靜態方法get_by_id()或get_by_key_name(),返回一個MyModel對象,調用該對象的delete()就可以。
四.8 Django的HTML模板。示範範例中有 {% if a %}的寫法,我照貓畫虎,寫出來的 {% if a = b %} 被報告有語法錯誤,查了django模板文檔才知道要寫成 {% ifequal a b %},不直觀啊,害我猜錯了。另外,感覺這個模板系統思路有問題,HTML中充斥著{%%},一塌糊塗,既不成HTML也不成Python,生產力不高(但總比在Python代碼中到處嵌HTML好一些);應該借鑒Tapestry的模板思路,對HTML有最小的侵入性,讓標準的HTML編輯工具(DreamWeaver)仍然能夠正常工作,否則美工MM是不喜歡參予你的項目的,她非常難跟你合作。Tapestry的模板系統,是我接觸到的最好的思路正確的模板系統,將來易語言的ESP(Easy Server Pages)或許會引入相似的模板。
四.9 把輸出編碼設定為UTF-8,就能夠非常自然地顯示中文了:handler.response.headers[‘Content-Type‘] = ‘text/html; charset=utf-8‘
五,學習和實踐的成果
這兩天的成果是:走完了新手教程的整個流程,形成網站http://liigotemp.appspot.com/;寫了一個簡單的小程式,形成網站http://liigoshared.appspot.com/(臨時沒有編輯功能)。
Google App Engine 學習和實踐