




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
GoogleAppEngine入門指南本指南將介紹如何開(kāi)發(fā)以及展現(xiàn)一個(gè)簡(jiǎn)潔的GoogleAppEngine工程。這個(gè)例如工程-一個(gè)用戶留言簿-將會(huì)向你展現(xiàn)如何使用GoogleAppEngine的多項(xiàng)效勞,包括數(shù)據(jù)庫(kù)效勞和谷歌帳戶效勞。GoogleAppEngine入門指南包括以下幾個(gè)局部:介紹編程環(huán)境Hello,World!webapp框架Google帳戶效勞webapp處理表單使用數(shù)據(jù)庫(kù)存儲(chǔ)使用模板使用靜態(tài)文件上傳你的程序介紹|GoogleAppEngine入門指南歡送來(lái)到GoogleAppEngine!創(chuàng)立一個(gè)AppEngine應(yīng)用程序很簡(jiǎn)潔的,只需要幾分鐘的時(shí)間。而且是免費(fèi)的,只要你上傳你的程序,你的網(wǎng)站就可以和用戶見(jiàn)面了,不需要任何付款和投入。GoogleAppEngine入門指南中,你將會(huì)創(chuàng)立一個(gè)用戶留言簿,它可以讓用戶在公共的留言板上發(fā)表留言。用戶可以匿名留言,也可以使用他們的Google帳戶留言。這個(gè)留言簿程序?qū)?huì)向你展現(xiàn)如何使用AppEngine的數(shù)據(jù)庫(kù)存儲(chǔ),如何將一個(gè)AppEnginePython〔在AppEngine1中叫做weba。這個(gè)小程序還將會(huì)展現(xiàn)如何使用Django模板引擎。編程環(huán)境|GoogleAppEngine入門指南AppEngine的softwaredevelopmentkit(SDK)GoogleAppEngine程序。SDK〔webserver〕AppEngine的環(huán)境,包括一個(gè)本地版的數(shù)據(jù)庫(kù),Google帳戶,以及獵取遠(yuǎn)程地址(URLs)和從你的本地計(jì)算機(jī)發(fā)送郵件這一些列AppEngine的APSDK需要運(yùn)行在Python2.Python2.5的各個(gè)版本支持Windows,MacOSXLinux。假設(shè)需要,可以從Python的官方網(wǎng)站下載適合你的操作系統(tǒng)的Python2.5并安裝在你的電腦上。MacOSX10.5Leopard用戶的電腦上默認(rèn)已經(jīng)安裝好了Python2.5。AppEngineSDK,然后依據(jù)下載頁(yè)面上的指示將SDK安裝在你的計(jì)算機(jī)上。在本入門指南中,你將會(huì)用到SDK中的兩個(gè)命令:dev_appserver.py,開(kāi)發(fā)版網(wǎng)站效勞器appcfg.py,用來(lái)上傳你的程序到AppEngine網(wǎng)站對(duì)于Windows用戶:AppEngineSDK的Windows安裝程序會(huì)將這些命令添加到命令path里,在安裝之后,你可以直接在命令行中使用這些命令。對(duì)于Mac用戶:GoogleAppEngineLauncher會(huì)將這些命令包含在程序當(dāng)中,你可以將這些命令添加到命令 path通過(guò)選擇“GoogleAppEngineLauncher“菜單里的“MakSymlinks...”或者你可以直接用Launcher來(lái)運(yùn)行開(kāi)發(fā)效勞器以及展現(xiàn)你的網(wǎng)頁(yè)程序。假設(shè)你使用的是Zip存檔版的SDK,,你將在google_appengine名目中找到相應(yīng)的python程序。Hello,World!|GoogleAppEngine入門指南GoogleAppEngine使用CGI應(yīng)用程序的一個(gè)懇求時(shí),它會(huì)運(yùn)行程序,依據(jù)環(huán)境變量里的懇求變量以及標(biāo)準(zhǔn)的輸入流header和內(nèi)容。讓我們首先做一個(gè)小程序以顯示一則很短的信息。2RequestHandlerhelloworld.。全部的這個(gè)程序的文件都放在這個(gè)名目下面。helloworldhelloworld.py,的文件,然后在里面輸入:print”Content-Type:text/plain”print””print”Hello,world!”這段Python腳本代碼將會(huì)對(duì)每一個(gè)WEB懇求響應(yīng)一段Hello,world。創(chuàng)立配置文件
用來(lái)描述內(nèi)容,AppEngine程序app.yamlURLs用哪一個(gè)handler代碼來(lái)處理。helloworldapp.yaml的文件,內(nèi)容如下:application:helloworldversion:1runtime:pythonapi_version:1handlers:-url:/.*script:helloworld.py3從上到下,這個(gè)配置文件講了如下幾個(gè)關(guān)于應(yīng)用程序的內(nèi)容:這個(gè)應(yīng)用程序的IDhelloworld。當(dāng)你在最終一步中上傳你的程序時(shí),你得選擇一個(gè)唯一的IDhelloworld。在調(diào)試開(kāi)發(fā)階段,這個(gè)ID可以是任何helloworld。這個(gè)程序代碼的版本號(hào)是1,假設(shè)你上傳了的版本的程序,AppEngine會(huì)保存以前的版本,通過(guò)治理掌握臺(tái),你可以將你的AppEngine程序恢復(fù)到以前的版本。python1.runtime環(huán)境和語(yǔ)言可能會(huì)在將來(lái)得到支持。每個(gè)符合正則表達(dá)式/.*(即全部URLs)都將用helloworld.py這段代碼進(jìn)展處理。Thesyntaxofthisfileis YAML.Foracompletelistofconfigurationoptions,see app.yamlreference.這個(gè)文件的語(yǔ)法是YAML.。關(guān)于完整的配置選項(xiàng),參見(jiàn)theapp.yamlreference。調(diào)試程序有了處理腳本代碼和用來(lái)映射URL的配置文件之后,這個(gè)程序就完整了。你現(xiàn)在可以AppEngineSDK內(nèi)置的效勞器測(cè)試你的程序了。用下面的命令來(lái)啟動(dòng)webhelloworld的文件夾地址添加到命令后面:google_appengine/dev_appserver.pyhelloworld/web效勞器現(xiàn)在就開(kāi)頭運(yùn)行了,監(jiān)聽(tīng)端口為8080.使用下面的地址就可以在掃瞄器中調(diào)試你的程序了:://localhost:8080/想要獵取更多關(guān)于運(yùn)行開(kāi)發(fā)web效勞器的信息,比方如何轉(zhuǎn)變監(jiān)聽(tīng)端口,參見(jiàn)theDevWebServerreference,或者在命令后面添加--help。4連續(xù)開(kāi)發(fā)你可以在效勞器運(yùn)行的時(shí)候連續(xù)開(kāi)發(fā)你的程序,web效勞器會(huì)查看你的源文件的轉(zhuǎn)變,并在需要的時(shí)候重加載。webhelloworld.py里的文件內(nèi)容,將Hello,world!改成其他的內(nèi)容,然后重訪問(wèn)://localhost:8080/,你會(huì)看到頁(yè)面發(fā)生了轉(zhuǎn)變~想要關(guān)閉web效勞器,只要在terminal窗口激活的狀況下,按Control-C〔或者對(duì)于你的掌握臺(tái)來(lái)說(shuō)正確的打斷命令。你可以在本使用指南的下面的局部中始終保持web次你仍可以使用上面的代碼來(lái)將web效勞器重開(kāi)啟。使用webapp框架|中文版GoogleAppEngine入門指南CGI標(biāo)準(zhǔn)是很簡(jiǎn)潔的,但是要把全部的代碼一一寫(xiě)出來(lái)還是很繁重的。WEBapp框架幫你解決了這些具體問(wèn)題,這樣你就可以將你的精力集中在你的程序的功能上了。GoogleAppEngine支持全部用Python寫(xiě)的關(guān)于CGI的網(wǎng)站框架〔包括使用CGIadaptor的WSGI-compliant框架,包括Djang,CherryP,Pylon,以及web.p.。你只需要吧這個(gè)框架的代碼復(fù)制到你的程序名目下就可以使用這個(gè)框架了。AppEngine包括了一個(gè)很簡(jiǎn)潔的web應(yīng)用框架,叫做webapp。這個(gè)webapp框架已經(jīng)在AppEngine開(kāi)發(fā)環(huán)境和SDK中去,就可以使用這個(gè)框架了。在下面的教程中我們將使用webapp框架。Hello,webapp!webapp程序包含三個(gè)局部:5一個(gè)或多個(gè)RequestHandler類用來(lái)處理懇求和產(chǎn)生響應(yīng)。一個(gè)WSGIApplication實(shí)例用來(lái)依據(jù)發(fā)送懇求的URL對(duì)應(yīng)到相應(yīng)的類一個(gè)主程序用來(lái)運(yùn)行WSGIApplication〔CGIadaptor〕下面讓我們來(lái)把我們的歡迎辭改寫(xiě)成一個(gè) webapp 程序. 編輯helloworld/helloworld.py文件,替換為下面的代碼:fromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appclassMain(webapp.RequestHandler):defget(self):self.response.headers[”Content-Type”]=”text/plain”self.response.out.write(”Hello,webappWorld!”)application=webapp.WSGIApplication([(”/”,Main)],debug=True)defmain:run_wsgi_app(application)if name==“ main main在你的掃瞄器中重加載://localhost:8080/,你將會(huì)看到轉(zhuǎn)變。webserver,那么可以重翻開(kāi),方法詳見(jiàn)“Hello,World!“.)webapp做了些什么呢?6
(假設(shè)你關(guān)閉了這個(gè)webapp模塊是在google.appengine.extSDK供給,在公布版的運(yùn)行環(huán)境中也會(huì)包括。上面這段代碼定義了一個(gè)requesthandler,Main,映射到根名目URL(/)。當(dāng)webapp接收到一個(gè)來(lái)自URL/GET懇求后,它就會(huì)初始化Main類,然后調(diào)用這個(gè)實(shí)例的get方法。在這個(gè)方法里面,關(guān)于懇求的信息可以通過(guò)self.request來(lái)獲得。通常,這個(gè)方法都會(huì)設(shè)置self.response的屬性以進(jìn)展響應(yīng),然后退出方法。webappMain實(shí)例的生命期最終的狀態(tài)發(fā)送出響應(yīng)。webapp.WSGIApplication實(shí)例所代表。參數(shù)debug=true將會(huì)傳遞給生產(chǎn)函數(shù),告知webapp假設(shè)在程序運(yùn)行過(guò)程中遇到錯(cuò)誤,輸出堆棧調(diào)用的記錄。對(duì)于產(chǎn)品版的程序,你可能會(huì)去掉這個(gè)參數(shù)。函數(shù)run_wsgi_app接收WSGIApplication實(shí)例(或者其他WSGI-compatible程序?qū)ο?,然后將這個(gè)程序在AppEngine”sCGIenvironment里運(yùn)行。run_wsgi_app和Pythonwsgiref模塊中的WSGI-to-CGIadaptor外的功能。比方,它可以自動(dòng)檢測(cè)程序是否是運(yùn)行在調(diào)試環(huán)境,并且可以在調(diào)試環(huán)境中輸出錯(cuò)誤。webappwebapp的內(nèi)容,訪問(wèn):thewebappreference。使用Google帳戶效勞|中文版GoogleAppEngine入門指南GoogleAppEngine供給了很多基于GoogleSDK中供給的類庫(kù)來(lái)調(diào)用這些效勞。一個(gè)很重要的效勞就是用戶效勞,它可以讓你的應(yīng)用程序和GoogleGoogle帳號(hào)就可以登錄到你的網(wǎng)站了。下面我們用用戶類效勞來(lái)共性化我們的歡送辭:Users類7編輯helloworld/helloworld.py:fromgoogle.appengine.apiimportusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appclassMain(webapp.RequestHandler):defget(self):user=users.get_current_userifuser:self.response.headers[”Content-Type”]=”text/plain”self.response.out.write(”Hello,”+user.nickname)else:self.redirect(users.create_login_url(self.request.uri))application=webapp.WSGIApplication([(”/”,Main)],debug=True)defmain:run_wsgi_app(application)if name==“ main mainGoogle登錄界面,輸入你想要的用戶名,那么你的應(yīng)用程序?qū)?huì)看到這個(gè)基于你給的用戶名所創(chuàng)立的一個(gè)虛擬的User類對(duì)象。8當(dāng)你的應(yīng)用程序運(yùn)行在AppEngineGoogle賬戶登錄頁(yè)面,然后會(huì)返回到成功登陸前或者創(chuàng)立用戶之前用戶所在的頁(yè)面。Users類的API讓我們認(rèn)真來(lái)看看這些代碼:user=users.get_current_user假設(shè)用戶已經(jīng)登錄了,get_current_userUser對(duì)象,否則,將會(huì)返回None。ifuser:self.response.headers[”Content-Type”]=”text/plain”self.response.out.write(”Hello,”+user.nickname)假設(shè)用戶已經(jīng)登錄了,將會(huì)依據(jù)用戶的賬戶,輸出一段含有用戶昵稱的歡送辭。else:self.redirect(users.create_login_url(self.request.uri))假設(shè)用戶沒(méi)有登錄,則告知webapp讓它將頁(yè)面重定向到Google賬戶登錄頁(yè)面。這個(gè)重定向包含了用戶所在的頁(yè)面URI(self.request.uri)所以之后將會(huì)返回到成功登陸前或者創(chuàng)立用戶之前用戶所在的頁(yè)面。想了解更多關(guān)于Users類的API,訪問(wèn)theUsersreference。webapp處理表單|中文版GoogleAppEngine入門指南假設(shè)你期望用戶自己可以留言,那么你需要一種處理用戶輸入信息的方法。而webapp讓數(shù)據(jù)處理變得很簡(jiǎn)潔。9webappWeb表單的數(shù)據(jù)importcgifromgoogle.appengine.apiimportusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appclassMain(webapp.RequestHandler):defget(self):self.response.out.write(“““<html><body><formaction=“/sign“method=“post“><div><textareacols=“60“></textarea></div>
name=“content“ rows=“3“<div><inputtype=“submit“value=“SignGuestbook“></div></form></body></html>“““)classGuestbook(webapp.RequestHandler):defpost(self):self.response.out.write(”<html><body>Youwrote:<pre>”)self.response.out.write(cgi.escape(self.request.get(”content”)))self.response.out.write(”</pre></body></html>”)10application=webapp.WSGIApplication([(”/”,Main),(”/sign”,Guestbook)],debug=True)defmain:run_wsgi_app(application)if name==“ main main重加載你的程序頁(yè)面,你將會(huì)看到表單,試著寫(xiě)點(diǎn)東西提交吧。這個(gè)版本的程序有兩個(gè)handlerMain,映射到URL/,用來(lái)展現(xiàn)表單.Guestbook,映射到URL/sign,用來(lái)展現(xiàn)用戶提交表單的內(nèi)容。Guestbookhandler有一個(gè)post方法〔而不是get方法。這是由于用Main所展現(xiàn)的頁(yè)面里用了POST方法(method=“post“)來(lái)提交表單里的數(shù)據(jù)。假設(shè)你需要在一個(gè)類中同時(shí)使用這兩個(gè)方法,只需要各自分別定義在一個(gè)類下面就可以了。postself.requestcgi.escape方法來(lái)去掉用戶輸入中的一些HTML代碼標(biāo)識(shí)符。cgiPythonthedocumentationforcgi。11留意:AppEngine編程環(huán)境包含了全部Python2.5的標(biāo)準(zhǔn)類庫(kù)。但是,不是全部的方法都被允許的。AppEngine程序與性在一個(gè)受限制的環(huán)境中,這樣AppEngine可以安全地將這些程序規(guī)模化。比方,底層的一些對(duì)于操作系統(tǒng),網(wǎng)絡(luò)操作,以及一些文件系統(tǒng)的操作都是不允許的,假設(shè)試圖調(diào)用這些函數(shù),將引發(fā)錯(cuò)誤。更多信息,請(qǐng)?jiān)L問(wèn)ThePythonRuntimeEnvironment。使用數(shù)據(jù)庫(kù)存儲(chǔ)|GoogleAppEngine入門指南對(duì)于一個(gè)數(shù)據(jù)量大的網(wǎng)站應(yīng)用來(lái)說(shuō)數(shù)據(jù)存儲(chǔ)是個(gè)很有技巧的的事情。用戶可能在一個(gè)特定的時(shí)間發(fā)出了一個(gè)數(shù)據(jù)懇求,但是下一個(gè)時(shí)間又發(fā)出了另外一個(gè)完全不同的數(shù)據(jù)請(qǐng)WEB效勞都需要協(xié)調(diào)這些相互影響的懇求,并且這些懇求可能來(lái)自世界的各個(gè)地方。API來(lái)實(shí)現(xiàn)全部關(guān)于數(shù)據(jù)存儲(chǔ)的問(wèn)題。數(shù)據(jù)存儲(chǔ)完整實(shí)例下面是一個(gè)最版的helloworld/helloworld.py代碼,用來(lái)存儲(chǔ)用戶的留言。下面的全部文字都是用來(lái)解釋這段代碼的。importcgifromgoogle.appengine.apiimportusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_app12fromgoogle.appengine.extimportdbclassGreeting(db.Model):author=db.UserPropertycontent=db.StringProperty(multiline=True)date=db.DateTimeProperty(auto_now_add=True)classMain(webapp.RequestHandler):defget(self):self.response.out.write(”<html><body>”)greetings=db.GqlQuery(“SELECT*FROMGreetingORDERBYdateDESCLIMIT10“)forgreetingingreetings:ifgreeting.author:self.response.out.write(”<b>%s</b>wrote:”%greeting.author.nickname)else:self.response.out.write(”Ananonymouspersonwrote:” )self.response.out.write(”<blockquote>%s</blockquote>”%cgi.escape(greeting.content))#Writethesubmissionformandthefooteroftheself.response.out.write(“““<formaction=“/sign“method=“post“><div><textareacols=“60“></textarea></div>
name=“content“ rows=“3“<div><inputtype=“submit“value=“SignGuestbook“></div></form>13</body></html>“““)classGuestbook(webapp.RequestHandler):defpost(self):greeting=Greetingifusers.get_current_user:greeting.author=users.get_current_usergreeting.content=self.request.get(”content”)greeting.putself.redirect(”/”)application=webapp.WSGIApplication([(”/”,Main),(”/sign”,Guestbook)],debug=True)defmain:run_wsgi_app(application)if name==“ main main將上面的代碼替換掉helloworld/helloworld.py原有的代碼,然后重加載://localhost:8080/試著公布一條留言,看看你的留言是否被正確地存儲(chǔ)并且正常地顯示了。存儲(chǔ)用戶提交的留言14AppEngine包含了一個(gè)基于Python的數(shù)據(jù)存儲(chǔ)模型.Django”sdatamodellingAPI,但是使用了Google自己的存儲(chǔ)環(huán)境.對(duì)于上一章實(shí)現(xiàn)的留言程序,名稱,消息內(nèi)容,公布時(shí)間等等,并且依據(jù)留言的先后將其顯示出來(lái)。datamodelingAPI,在代碼頂部添加google.appengine.ext.db模塊:fromgoogle.appengine.extimportdb下面的這段代碼定義了一個(gè)用來(lái)存儲(chǔ)用戶留言的模塊:classGreeting(db.Model):author=db.UserPropertycontent=db.StringProperty(multiline=True)date=db.DateTimeProperty(auto_now_add=True)這段代碼定義了Greeting模型的三個(gè)屬性:author是一個(gè)User對(duì)象,content是一個(gè)字符串對(duì)象,anddatedatetime.datetime對(duì)象。其中一些屬性包含了默認(rèn)值:比方db.StringProperty類型中multiline=True說(shuō)明該字符串中可以包含換行符;db.DateTimeProperty類型中auto_now_add=TrueGreeting對(duì)象創(chuàng)立的時(shí)候,將使用當(dāng)前時(shí)間初始化這個(gè)屬性。關(guān)于數(shù)據(jù)模型的屬性的更多幫助,請(qǐng)查看theDatastorereference。既然我們已經(jīng)定義了一個(gè)數(shù)據(jù)對(duì)象模型,接下來(lái),我們創(chuàng)立一個(gè)Greeting對(duì)象,并且把它保存起來(lái)。編輯Guestbookhandler:classGuestbook(webapp.RequestHandler):defpost(self):greeting=Greetingifusers.get_current_user:15greeting.author=users.get_current_usergreeting.content=self.request.get(”content”)greeting.putself.redirect(”/”)這個(gè)的Guestbookhandler創(chuàng)立了一個(gè)的Greeting對(duì)象,然后依據(jù)用戶提交的數(shù)據(jù)設(shè)置author和content的屬性值。它并沒(méi)有甚至date的值,所以date會(huì)自動(dòng)設(shè)成當(dāng)前時(shí)間,由于我們?cè)谀P徒⒌臅r(shí)候已經(jīng)設(shè)置了。最終一行,greeting.putput進(jìn)去的是從數(shù)據(jù)庫(kù)中提取的對(duì)象,put會(huì)更那條數(shù)據(jù)記錄,而現(xiàn)在我們是創(chuàng)立的一個(gè)對(duì)象,所以put會(huì)添加一條的記錄到數(shù)據(jù)存儲(chǔ)里。GQL獵取數(shù)據(jù)記錄AppEnginedatastore使用了一套簡(jiǎn)單的數(shù)據(jù)儲(chǔ)存系統(tǒng).但是它并不是一個(gè)標(biāo)準(zhǔn)Sql語(yǔ)句進(jìn)展查詢。作為一個(gè)替代,GoogleSqlGQL.GQLSQL根本類似的語(yǔ)法來(lái)讀取數(shù)據(jù)。下面是版的Mainhandler代碼,用來(lái)查詢數(shù)據(jù)庫(kù)中的全部留言。classMain(webapp.RequestHandler):defget(self):self.response.out.write(”<html><body>”)greetings=db.GqlQuery(“SELECT*FROMGreetingORDERBYdateDESCLIMIT10“)forgreetingingreetings:ifgreeting.author:self.response.out.write(”<b>%s</b>wrote:”%greeting.author.nickname)16else:self.response.out.write(”Ananonymouspersonwrote:” )self.response.out.write(”<blockquote>%s</blockquote>”%cgi.escape(greeting.content))#Writethesubmissionformandthefooteroftheself.response.out.write(“““<formaction=“/sign“method=“post“><div><textareacols=“60“></textarea></div>
name=“content“ rows=“3“<div><inputtype=“submit“value=“SignGuestbook“></div></form></body></html>“““)查詢語(yǔ)句消滅在這一行:greetings=db.GqlQuery(“SELECT*FROMGreetingORDERBYdateDESCLIMIT10“)或者,你也可以在Greeting類里面調(diào)用gql(...)方法,那樣就不必使用SELECT*FROMGreeting 這樣的查詢語(yǔ)句了:greetings=Greeting.gql(“ORDERBYdateDESCLIMIT10“ )SQL語(yǔ)句類似,關(guān)鍵字(比方SELECT)是大小寫(xiě)無(wú)視的,字段名是區(qū)分大小寫(xiě)的。要留意的是,GQL語(yǔ)句總是返回完整的對(duì)象,所以GQL查詢語(yǔ)句不能指定要查詢的字段名。也就是說(shuō),全部的GQL語(yǔ)句都是以SELECT*FROM model 開(kāi)頭的。一個(gè)GQL查詢語(yǔ)句可以用WHERE指定查詢條件,你可以指定一個(gè)或多個(gè)條件。和17SQLGQL不GQL例如,獵取當(dāng)前登錄用戶的留言:ifusers.get_current_user:greetings=Greeting.gql(“WHEREauthor=:1ORDERBYdateDESC“ ,users.get_current_user)你也可以使用命名參數(shù)代替之:greetings=Greeting.gql(“WHEREauthor=:authorORDERBYdateDESC“ ,author=users.get_current_user)另外GoogledatastoreAPI還供給了另外一種獵取數(shù)據(jù)的方法::greetings=Greeting.allgreetings.filter(“author=“,users.get_current_user)greetings.order(“-date“)想了解GQL查詢語(yǔ)法的更多內(nèi)容,請(qǐng)查看theDatastorereference。清空開(kāi)發(fā)版效勞器中的數(shù)據(jù)存儲(chǔ)為了便利你測(cè)試自己的應(yīng)用,GAE開(kāi)發(fā)環(huán)境使用了一個(gè)臨時(shí)文件來(lái)保存本地的數(shù)據(jù),要清空本地開(kāi)發(fā)環(huán)境的數(shù)據(jù),可以使用如下的命令行:dev_appserver.py--clear_datastorehelloworld/使用模板|GoogleAppEngine入門指南HTML里面嵌入在編程代碼里是格外雜亂的,所以我們最好使用一個(gè)獨(dú)立的文件來(lái)特地處理HTML代碼,以便于將界面顯示和數(shù)據(jù)獵取的過(guò)程相互獨(dú)立出來(lái)。有很多使用Python實(shí)現(xiàn)的模板系統(tǒng),比方:EZT,Cheetah,ClearSilver,Quixote, Django等等.你18可以選擇這里面的任意一個(gè)。為了大家便利, webapp模塊默認(rèn)包含了Django的模板系統(tǒng).Django模板是GoogleAppEngine的一局部,所以你不需要單獨(dú)進(jìn)展綁定就可以直接使用。Django模板首先在helloworld/helloworld.pytemplate模塊:importosfromgoogle.appengine.ext.webappimporttemplate重編寫(xiě)Mainhandler:classMain(webapp.RequestHandler):defget(self):greetings_query=Greeting.all.order(”-date”)greetings=greetings_query.fetch(10)ifusers.get_current_user:url=users.create_logout_url(self.request.uri)url_linktext=”Logout”else:url=users.create_login_url(self.request.uri)19url_linktext=”Login”template_values={”greetings”:greetings,”url”:url,”url_linktext”:url_linktext,}path=os.path.join(os.path.dirname( file ),”index.html”)self.response.out.write(template.render(path,template_values))最終,在helloworldindex.html,內(nèi)容如下:<html><body>{%forgreetingingreetings%}{%ifgreeting.author%}
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 深圳市二手房裝修工程施工合同
- 跨國(guó)(非獨(dú)占)品牌授權(quán)合作合同專業(yè)版
- 勞動(dòng)合同判例解析:合同糾紛與法律適用
- 實(shí)習(xí)生實(shí)習(xí)與就業(yè)合同書(shū)
- 反擔(dān)保責(zé)任合同模板
- 購(gòu)銷合同的反擔(dān)保書(shū)
- 全球商標(biāo)使用權(quán)轉(zhuǎn)讓合同
- 實(shí)習(xí)人員合同范本
- 終止建筑工程合同協(xié)議書(shū)
- 企業(yè)學(xué)徒工用工合同范本
- 開(kāi)學(xué)安全第一課主題班會(huì)課件
- 一年級(jí)珍惜糧食主題班會(huì)學(xué)習(xí)教案
- 新版《醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范》(2024)培訓(xùn)試題及答案
- 2025年人教版數(shù)學(xué)五年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 海岸動(dòng)力學(xué)英文課件Coastal Hydrodynamics-復(fù)習(xí)
- 碳足跡研究-洞察分析
- 硬質(zhì)巖層組合切割開(kāi)挖技術(shù)
- 2024解析:第二章聲現(xiàn)象-講核心(解析版)
- 2024年考研管理類綜合能力(199)真題及解析完整版
- 2025年初級(jí)社會(huì)工作者綜合能力全國(guó)考試題庫(kù)(含答案)
- 2024解析:第十章 浮力綜合應(yīng)用-講核心(解析版)
評(píng)論
0/150
提交評(píng)論