




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中文版GoogleAppEngine入门指南本指南将介绍如何开发以及展示一个简单的GoogleAppEngine项目。这个示例项目-一个用户留言簿-将会向你展示如何使用GoogleAppEngine的多项服务,包括数据库服务和谷歌帐户服务。GoogleAppEngine入门指南包括以下几个部分: 介绍 编程环境 Hello,World! 使用webapp框架 使用Google帐户服务 用webapp处理表单 使用数据库存储 使用模板 使用静态文件 上传你的程序介绍|中文版GoogleAppEngine入门指南欢迎来到GoogleAppEngine!创建一个AppEngine应用程序很简单的,只
2、需要几分钟的时间。而且是免费的,只要你上传你的程序,你的网站就可以和用户见面了,不需要任何付款和投入。在GoogleAppEngine入门指南中,你将会创建一个用户留言簿,它可以让用户在公共的留言板上发表留言。用户可以匿名留言,也可以使用他们的Google帐户留言。这个留言簿程序将会向你展示如何使用AppEngine的数据库存储、如何将一个AppEngine和谷歌帐户进行整合,以及如何使用一个简单的Python网站框架(在AppEngine中叫做webap)。这个小程序还将会展示如何使用Django模板引擎。编程环境|中文版GoogleAppEngine入门指南你要通过AppEngine的so
3、ftwaredevelopmentkit(SDK)来开发,上传你的GoogleAppEngine程序。这个SDK里包括了一个网站服务器(webserver)程序,用来模拟AppEngine的环境,包括一个本地版的数据库,Google帐户,以及获取远程地址(URLs)和从你的本地计算机发送邮件这一些列AppEngine的API。本SDK需要运行在Python2.5上,Python2.5的各个版本支持Windows,MacOSX和Linux。如果需要,可以从Python的官方网站下载适合你的操作系统的Python2.5并安装在你的电脑上。MacOSX10.5Leopard用户的电脑上默认已经安装好
4、了Python2.5。下载AppEngineSDK,然后按照下载页面上的指示将SDK安装在你的计算机上。在本入门指南中,你将会用到SDK中的两个命令: devappserver.py,开发版网站服务器 appcfg.py,用来上传你的程序到AppEngine网站对于Windows用户:AppEngineSDK的Windows安装程序会将这些命令添加到命令path里,在安装之后,你可以直接在命令行中使用这些命令。对于Mac用户:GoogleAppEngineLauncher会将这些命令包含在程序当中,你可以将这些命令添加到命令path通过选择"GoogleAppEngineLaunch
5、er"菜单里的MakSymlinks.或者,你可以直接用Launcher来运行开发服务器以及展示你的网页程序。如果你使用的是Zip存档版的SDK,你将在google_appengine目录中找到相应的python程序。Hello,World!|中文版GoogleAppEngine入门指南GoogleAppEngine使用CGI标准来和网站服务器进行交互。当服务器接收到来自你的应用程序的一个请求时,它会运行程序,根据环境变量里的请求变量以及标准的输入流(对于POST的数据)。对于响应,CGI会使用标准的输出流来输出,包括HTTPheader和内容。让我们首先做一个小程序以显示一则很短的
6、信息创建一个简单的RequestHandler创建一个文件夹名字叫helloworld.。所有的这个程序的文件都放在这个目录下面。在helloworld文件夹里,创建一个名字叫helloworld.py,的文件,然后在里面输入:print'Content-Type:text/plain'print''print'Hello,world!'这段Python脚本代码将会对每一个WEB请求响应一段HTTPheader(用来描述内容),一个空行,以及一则信息Hello,world!。创建配置文件每个AppEngine程序都有一个配置文件叫做app.yam
7、l。这个文件用来告诉服务器哪一段URLs用哪一个handler代码来处理。在helloworld文件夹里,创建一个名叫app.yaml的文件,内容如下:application:helloworldversion:1runtime:pythonapi_version:1handlers:-url:/.*script:helloworld.py从上到下,这个配置文件讲了如下几个关于应用程序的内容: 这个应用程序的ID是helloworld。当你在最后一步中上传你的程序时,你得选择一个唯一的ID,然后代替掉这个helloworld。在调试开发阶段,这个ID可以是任何值。现在,我们把它设成hellow
8、orld。 这个程序代码的版本号是1,如果你上传了新的版本的程序,AppEngine会保留以前的版本,通过管理控制台,你可以将你的AppEngine程序恢复到以前的版本。 这段代码是在python运行时环境下运行的,版本号是1.其他的runtime环境和语言可能会在将来得到支持。 每个符合正则表达式/.*(即所有URLs)都将用helloworld.py这段代码进行处理。ThesyntaxofthisfileisYAML.Foracompletelistofconfigurationoptions,seetheapp.yamlreference.这个文件的语法是YAML.o关于完整的配置选项,
9、参见theapp.yamlreference。调试程序有了处理脚本代码和用来映射URL的配置文件之后,这个程序就完整了。你现在可以使用AppEngineSDK内置的服务器测试你的程序了。用下面的命令来启动web服务器,将helloworld的文件夹地址添加到命令后面:google_appengine/dev_appserver.pyhelloworld/这个web服务器现在就开始运行了,监听端口为8080.使用下面的地址就可以在浏览器中调试你的程序了: http:/localhost:8080/想要获取更多关于运行开发web服务器的信息,比如如何改变监听端口,参见theDevWebServer
10、reference,或者在命令后面添加-help。继续开发你可以在服务器运行的时候继续开发你的程序,web服务器会查看你的源文件的改变,并在需要的时候重新加载。试试看:让web服务器保持运行,然后编辑helloworld.py里的文件内容,将Hello,world!改成其他的内容,然后重新访问http:/localhost:8080/,你会看到页面发生了改变想要关闭web服务器,只要在terminal窗口激活的情况下,按Control-C(或者对于你的控制台来说正确的打断命令)。你可以在本使用指南的下面的部分中一直保持web服务器运行,如果你需要关闭它,下次你仍可以使用上面的代码来将web服务
11、器重新开启。使用webapp框架|中文版GoogleAppEngine入门指南CGI标准是很简单的,但是要把所有的代码一一写出来还是很繁重的。WEBapp框架帮你解决了这些具体问题,这样你就可以将你的精力集中在你的程序的功能上了。GoogleAppEngine支持所有用Python写的关于CGI的网站框架(包括使用CGIadaptor的WSGI-compliant框架),包括Django,CherryPy,Pylons,以及web.py.。你只需要吧这个框架的代码复制到你的程序目录下就可以使用这个框架了。AppEngine包括了一个很简单的web应用框架,叫做webapp。这个webapp框架
12、已经在AppEngine开发环境和SDK中安装好了,所以你不需要添加任何代码到你的程序中去,就可以使用这个框架了。在下面的教程中我们将使用webapp框架。Hello,webapp!一个webapp程序包含三个部分一个或多个RequestHandler类用来处理请求和产生响应。一个WSGIApplication实例用来根据发送请求的URL对应到相应的类一个主程序用来运行WSGIApplication(使用CGIadaptor)下面让我们来把我们的欢迎辞改写成一个webapp程序.编辑helloworld/helloworld.py文件,替换为下面的代码:fromgoogle.appengine
13、.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appclassMainPage(webapp.RequestHandler):defget(self):self.response.headers'Content-Type'='text/plain'self.response.out.write('Hello,webappWorld!')application=webapp.WSGIApplication('/',MainPage),debug=
14、True)defmain():run_wsgi_app(application)if_name_=main()1_main_1在你的浏览器中重新加载http:/localhost:8080/,你将会看到改变。(如果你关闭了webserver,那么可以重新打开,方法详见"Hello,World!".)webapp做了些什么呢?这个webapp模块是在google.appengine.ext包里面的。这个模块由SDK提供,在发布版的运行环境中也会包括。上面这段代码定义了一个requesthandler,MainPage,映射到根目录URL(/)。当webapp接收到一个来自UR
15、L/的HTTPGET请求后,它就会初始化MainPage类,然后调用这个实例的get方法。在这个方法里面,关于请求的信息可以通过self.request来获得。通常,这个方法都会设置self.response的属性以进行响应,然后退出方法。webapp将会根据MainPage实例的生命期最后的状态发送出响应。应用程序本身由一个webapp.WSGIApplication实例所代表。参数debug=true将会传递给生产函数,告诉webapp如果在程序运行过程中遇到错误,输出堆栈调用的记录。对于产品版的程序,你可能会去掉这个参数。函数runwsgiapp()接收WSGIApplication实例
16、(或者其他WSGI-compatible程序对象),然后将这个程序在AppEngine'sCGIenvironment里运行。run_wsgi_app()和Python标准库里提供的wsgiref模块中的WSGI-to-CGIadaptor,但提供了一些额外的功能。比如,它可以自动检测程序是否是运行在调试环境,并且可以在调试环境中输出错误。我们将会在下面的入门指南中使用很多webapp的功能,想要了解更多关于webapp的内容,访问:thewebappreference。使用Google帐户服务|中文版GoogleAppEngine入门指南GoogleAppEngine提供了很多基于G
17、oogle框架下的有用的服务,可以通过SDK中提供的类库来调用这些服务。一个很重要的服务就是用户服务,它可以让你的应用程序和Google账户用户集成.有了这个用户服务,你的用户只需要拥有Google帐号就可以登录到你的网站了。下面我们用用户类服务来个性化我们的欢迎辞:使用Users类编辑helloworld/helloworld.py,替换为以下代码fromgoogle.appengine.apiimportusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_ap
18、pclassMainPage(webapp.RequestHandler):defget(self):user=users.get_current_user()ifuser: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
19、('/',MainPage),debug=True)defmain():run_wsgi_app(application)if_name_="_main_":main()重新加载你的网页,你的程序将会重定向到一个本地版的Google登录界面,输入你想要的用户名,那么你的应用程序将会看到这个基于你给的用户名所创建的一个虚拟的User类对象。当你的应用程序运行在AppEngine上之后,用户将会被重定向到Google账户登录页面,然后会返回到成功登陆前或者创建用户之前用户所在的页面。Users类的API让我们仔细来看看这些代码:user=users.get_cu
20、rrent_user()如果用户已经登录了,get_current_user()将会返回一个User对象,否则,将会返回None。ifuser:self.response.headers'Content-Type'='text/plain'self.response.out.write('Hello,'+user.nickname()如果用户已经登录了,将会根据用户的账户,输出一段含有用户昵称的欢迎辞。else:self.redirect(users.create_login_url(self.request.uri)如果用户没有登录,则告诉we
21、bapp让它将页面重定向到Google账户登录页面。这个重定向包含了用户所在的页面URI(self.request.uri)所以之后将会返回到成功登陆前或者创建用户之前用户所在的页面。想了解更多关于Users类的API,访问theUsersreference。webapp处理表单|中文版GoogleAppEngine入门指南如果你希望用户自己可以留言,那么你需要一种处理用户输入信息的办法。而webapp让数据处理变得很简单。用webapp处理Web表单的数据用下面的代码替换helloworld/helloworld.py:importcgifromgoogle.appengine.apiimp
22、ortusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appclassMainPage(webapp.RequestHandler):defget(self):self.response.out.write("""<html><body><formaction="/sign"method="post"><div><textareaname
23、="content"rows="3cols="60"></textarea></div><div><inputtype="submit"value="SignGuestbook"></div></form></body></html>""")classGuestbook(webapp.RequestHandler):defpost(self):self.response.ou
24、t.write('<html><body>Youwrote:<pre>')self.response.out.write(cgi.escape(self.request.get('content')self.response.out.write('</pre></body></html>')application=webapp.WSGIApplication('/',MainPage),('/sign',Guestbook),debug=Tru
25、e)defmain():run_wsgi_app(application)if_name_=main()1_main_1重新加载你的程序页面,你将会看到表单,试着写点东西提交吧。这个版本的程序有两个handler:MainPage,映射到URL/,用来展示表单.Guestbook,映射到URL/sign,用来展示用户提交表单的内容。Guestbookhandler有一个post()方法(而不是get()方法)。这是因为用MainPage所展示的页面里用了HTTPPOST方法(method="post")来提交表单里的数据。如果你需要在一个类中同时使用这两个方法(post()
26、get(),只需要各自分别定义在一个类下面就可以了。post()方法里的代码可以从self.request中获取表单数据,在将这些数据返回并展示给用户之前,它调用了cgi.escape()方法来去掉用户输入中的一些HTML代码标识符。cgi是标准Python类库中的一个模块,详见thedocumentationforcgi。注意:AppEngine编程环境包含了所有Python2.5的标准类库。但是,不是所有的方法都被允许的。AppEngine程序与性在一个受限制的环境中,这样AppEngine可以安全地将这些程序规模化。比如,底层的一些对于操作系统,网络操作,以及一些文件系统的操作都是不允许
27、的,如果试图调用这些函数,将引发错误。更多信息,请访问ThePythonRuntimeEnvironment。使用数据库存储|中文版GoogleAppEngine入门指南对于一个数据量大的网站应用来说数据存储是个很有技巧的的事情。用户可能在一个特定的时间发出了一个数据请求,但是下一个时间又发出了另外一个完全不同的数据请求。所有的WEB服务都需要协调这些相互影响的请求,并且这些请求可能来自世界的各个地方。由于有了GoogleAppEngine,你再也不需要为这些发愁了。GoogleAppEngine架构将为提供分布式的数据处理,解决负载平衡的问题,并且提供了API来实现所有关于数据存储的问题。数
28、据存储完整实例下面是一个最新版的helloworld/helloworld.py代码,用来存储用户的留言。下面的所有文字都是用来解释这段代码的。importcgifromgoogle.appengine.apiimportusersfromgoogle.appengine.extimportwebappfromgoogle.appengine.ext.webapp.utilimportrun_wsgi_appfromgoogle.appengine.extimportdbclassGreeting(db.Model):author=db.UserProperty()content=db.Str
29、ingProperty(multiline=True)date=db.DateTimeProperty(auto_now_add=True)classMainPage(webapp.RequestHandler):defget(self):self.response.out.write('<html><body>')greetings=db.GqlQuery("SELECT*FROMGreetingORDERBYdateDESCLIMIT10")forgreetingingreetings:ifgreeting.author:self
30、.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)#Writethesubmissionformandthefooterofthepageself.re
31、sponse.out.write("""<formaction="/sign"method="post"><div><textareaname="content"rows="3cols="60"></textarea></div><div><inputtype="submit"value="SignGuestbook"></div></
32、form></body></html>""")classGuestbook(webapp.RequestHandler):defpost(self):greeting=Greeting()ifusers.get_current_user():greeting.author=users.get_current_user()greeting.content=self.request.get('content')greeting.put()self.redirect('/')application=webap
33、p.WSGIApplication('/',MainPage),('/sign',Guestbook),debug=True)defmain():run_wsgi_app(application)if_name_="_main_":main()将上面的代码替换掉helloworld/helloworld.py原有的代码,然后重新加载http:/localhost:8080/试着发布一条留言,看看你的留言是否被正确地存储并且正常地显示了。存储用户提交的留言AppEngine包含了一个基于Python的数据存储模型.这个模型类似于Django
34、39;sdatamodellingAPI,但是使用了Google自己的存储环境.对于上一章实现的留言程序,我们想要把用户提交的留言保存起来,每个留言都包含作者名称,消息内容,发布时间等等,并且按照留言的先后将其显示出来。为了使用datamodelingAPI,在代码顶部添加google.appengine.ext.db模块:fromgoogle.appengine.extimportdb下面的这段代码定义了一个用来存储用户留言的模块:classGreeting(db.Model):author=db.UserProperty()content=db.StringProperty(multili
35、ne=True)date=db.DateTimeProperty(auto_now_add=True)这段代码定义了Greeting模型的三个属性:author是一个User对象,content是一个字符串对象,anddate是一个datetime.datetime对象。其中一些属性包含了默认值:比如db.StringProperty类型中multiline=True表明该字符串中可以包含换行符;db.DateTimeProperty类型中auto_now_add=True表明当Greeting对象创建的时候,将使用当前时间初始化这个属性。关于数据模型的属性的更多帮助,请查看theDatast
36、orereference。既然我们已经定义了一个数据对象模型,接下来,我们创建一个Greeting对象,并且把它保存起来。编辑Guestbookhandler:classGuestbook(webapp.RequestHandler):defpost(self):greeting=Greeting()ifusers.get_current_user():greeting.author=users.get_current_user()greeting.content=self.request.get('content')greeting.put()self.redirect(
37、39;/')这个新的Guestbookhandler创建了一个新的Greeting对象,然后根据用户提交的数据设置author和content的属性值。它并没有甚至date的值,所以date会自动设成当前时间,因为我们在模型建立的时候已经设置了。最后一行,greeting.put()将新创建的对象保存进数据库,如果put()进去的是从数据库中提取的对象,put()会更新那条数据记录,而现在我们是新创建的一个对象,所以put()会添加一条新的记录到数据存储里。使用GQL获取数据记录AppEnginedatastore使用了一套复杂的数据储存系统.但是它并不是一个标准的关系数据库,所以不能
38、使用标准的Sql语句进行查询。作为一个替代,Google准备了一套类Sql的查询语句,称之为GQL.GQL提供了和SQL基本类似的语法来读取数据。下面是新版的MainPagehandler代码,用来查询数据库中的所有留言。classMainPage(webapp.RequestHandler):defget(self):self.response.out.write('<html><body>')greetings=db.GqlQuery("SELECT*FROMGreetingORDERBYdateDESCLIMIT10")forg
39、reetingingreetings:ifgreeting.author:%greeting.author.nickname()self.response.out.write('<b>%s</b>wrote:'else:self.response.out.write('Ananonymouspersonwrote:')self.response.out.write('<blockquote>%s</blockquote>'%cgi.escape(greeting.content)#Writethes
40、ubmissionformandthefooterofthepageself.response.out.write("""<formaction="/sign"method="post"><div><textareaname="content"rows="3"cols="60"></textarea></div><div><inputtype="submit"value
41、="SignGuestbook"></div></form></body></html>""")查询语句出现在这一行:greetings=db.GqlQuery("SELECT*FROMGreetingORDERBYdateDESCLIMIT10")或者,你也可以在Greeting类里面调用gql(.)方法,那样就不必使用SELECT*FROMGreeting这样的查询语句了:greetings=Greeting.gql("ORDERBYdateDESCLIMI
42、T10")和SQL语句类似,关键字(比如SELECT)是大小写无视的,字段名是区分大小写的。要注意白是,GQL语句总是返回完整的对象,所以GQL查询语句不能指定要查询的字段名。也就是说,所有的GQL语句都是以SELECT*FROMmodel开头的。一个GQL查询语句可以用WHERE指定查询条件,你可以指定一个或多个条件。和SQL不同白是,GQL查询不能包含变量值:GQL使用参数绑定查询中所有的变量.例如获取当前登录用户的留言:ifusers.get_current_user():greetings=Greeting.gql("WHEREauthor=:1ORDERBYdat
43、eDESC",users.get_current_user()你也可以使用命名参数代替之:greetings=Greeting.gql("WHEREauthor=:authorORDERBYdateDESC",author=users.get_current_user()另外,GoogledatastoreAPI还提供了另外一种获取数据的方法:greetings=Greeting.all()greetings.filter("author=",users.get_current_user()greetings.order("-date
44、")想了解GQL查询语法的更多内容,请查看theDatastorereference。清空开发版服务器中的数据存储为了方便你测试自己的应用,GAE开发环境使用了一个临时文件来保存本地的数据,要清空本地开发环境的数据,可以使用如下的命令行:dev_appserver.py-clear_datastorehelloworld/使用模板|中文版GoogleAppEngine入门指南HTML里面嵌入在编程代码里是非常杂乱的,所以我们最好使用一个独立的文件来专门处理HTML代码,以便于将界面显示和数据获取的过程相互独立出来。有很多使用Python实现的模板系统,比如:EZT,Cheetah,C
45、learSilver,Quixote,Django等等.你可以选择这里面的任意一个。为了大家方便,webapp模块默认包含了Django的模板系统.Django模板是GoogleAppEngine的一部分,所以你不需要单独进行绑定就可以直接使用。使用Django模板首先在helloworld/helloworld.py中引入template模块:importosfromgoogle.appengine.ext.webappimporttemplate重新编写MainPagehandler:classMainPage(webapp.RequestHandler):defget(self):gre
46、etings_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)url_linktext='Logintemplate_values='greetings':greeti
47、ngs,'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)最后,在helloworld的目录下面创建一个新文件index.html,内容如下:<html><body>%forgreetingingreetings%ifgreeting.author%<b>greeting.author.nickname</b>wrote:%else%Ananonymouspersonwrote:%endif%<blockquote>greeting.content|escape</blockquote>%
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 有机肥料施用技术手册
- 餐饮企业2025年供应链可持续发展案例研究报告
- 餐饮企业2025供应链智能化升级方案报告
- 社区团购平台2025年运营管理与用户留存策略实战案例分析报告
- 电商中秋活动方案
- 端午建材活动策划方案
- 美甲店特价活动方案
- 组织游客活动方案
- 端午期间促销活动方案
- 社工心理教育活动方案
- 高级考评员职业技能鉴定考试题库(含答案)
- 8《荷花淀》《小二黑结婚》《党费》群文阅读课件 2024-2025学年统编版高中语文选择性必修中册
- GB/T 10069.3-2024旋转电机噪声测定方法及限值第3部分:噪声限值
- 汛期安全隐患重点排查清单
- JB-T 12192-2015 深锥浓缩机介绍
- 石油化工设备维护检修规程设备完好标准SHS
- 带状疱疹疼痛科治疗课件
- 非物质文化遗产从概念到实践
- 救助管理机构护送服务规范
- 《产品形态设计》课程标准
- 胸部保养知识讲座
评论
0/150
提交评论