thinktt
作者thinktt·2015-11-04 15:04
系统工程师·罗云科技

我的《云计算核心技术剖析》读书笔记之Google App Engine 的使用

字数 5757阅读 1785评论 0赞 0

在介绍完App Engine之后,本节将通过一个简单的例子来介绍如何创建一个简单的App Engine程序,希望大家能通过这个例子对App Engine有更深层次的理解和认识。

一、例子

这个例子非常简单,就是提交一个关于Blog的表格,并将这个表格存储到App Engine的 Datastore中。本节将主要关注Python版App Engine。

二、搭建环境

在环境搭建方面,主要有F面3个步骤,其中第(3)步可选。

⑴安装最新稳定版的Python Runtime。有3个注意点:其一,Linux系统应该自带Python; 其二,在Windows上安装好Python之后,需要在系统路径上加入Python的目录,其三, App Engine上的应用服务器版本为2.6.5,所以请不要在项目中加入Python 2.6.5之后引入 的特性。

(2) 安装App Engine的SDK。有两点需要注意:其一是在Windows上安装好App Engine 的SDK之后,也需要在系统路径上加入SDK所在的目录,其二是在Linux上,无需安装App Engine的SDK,只需将其解压缩,并放置在合适的目录即可。

(3) 安装Eclipse及其Pydev插件。这步对那些只是想尝试一下App Engine的读者而言娃可 选的,徂是由于Eclipse自身成熟的开发环境,辅以Pydev自带的代码加色、自动提示和调试等 功能,再加上Pydev在其1A6版上加入了对Google App Engine的完整支持,所以说使用Eclipse 及其pydev插件将会非常有助于App Engine开发。

虽然如果不熟悉Python,并不会影响大家对本节的理解,但是如果大家想深入学习Python, 可以査看和学习相应的教程和资料,比如如/洲等。还有,我个人推荐大家使用Linux 作为App Engine的开发平台,因为Linux自带很多开发工具和完善的命令行。

三、初始化项目

App Engine SDK自带一个名为new_project_template的项目模板,该项目模板共有3个

文件。

□ app.yaml。这个文件是整个项目的配置文件,类似于Java Web项0中的web.xm丨文

件。

□ main.py。这个Python脚本是Aj>p Engine的“Hello World”文件,主要演示如何处理最 基本的Web清求。

□ index.yaml。这个文件设定项H所创建的数据模型的索引。要注意的是,这个文件一般 由App Engine系统自动维护。当App Engine调试或者部署应用的时候,它会分析应用 所包含的数据模型,来确定需不需要给数据添加新的索引。

我们可以通过复制这个项B模板來初始化项目。接下来将逐步编辑和创建各个文件,其中 第一个被编辑的是app.yaml。

1.编辑 app.yaml

就像上面提到的那样,app.yaml是整个项目的核心配置文件,其后缀“yaml”表示这个文 件是基于YAML语言的。YAML语言是可读性非常强的数据序列化语言,和XML相比,其可 读性更好,而且需要支持丰富的数据类型。代码清单3-1是已经编辑好的app.yaml。

代码清单3-1 app.yaml

application: idenext version: 1 runtime: python api_version: 1handlers:-url: /•*script: main.py

在app.yaml中,主要可以配置下面这些参数。

□应用名。对应的位置是application这行,用来设置整个项目的名字。在本地调试时, 项目名可以是任意的字符串,但当部署这个项目到云端App Engine平台时,需求确保 应用名和之前在App Engine管理界面上新建的应用名是一致的,所以这时应用名需要 是全App Engine唯一的,不能与其他人创建的项目的名字有冲突。 a项目版本号。对应的位置是version这行,用来配置应用的版本号,可以通过它來对 应用进行版本管理。由于本例是新创建的,所以其版本号是1。

□运行时。对应的位置是runtime这行,用来设定项目的开发语言。现在有Python和Java 两种开发语言可供选择,由于本例是使用Python的,所以在此填入python。

3AP丨版本号。对应的位置是api_version这行,指的是使用的AppEngineAPI的版本 号,B前为1。

U处理Web请求的类。对应的位置是handlers部分,这部分配置了 URL和Python脚 本之间对应的关系。也就是说,当Aj)pEngine收到一个Web请求时,它会根据其URL .来调用相应的脚本。在上面这个例子中,当URL为的情况下,会调用main.py 来处理。

2.创建HTML文件

代码清单3-2是index.html的代码。

代码清单3 -2 index.html

<html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/><title>App Engine Demo</titXe></head><body><form method="POST" action="/">文章名:<input type=" textw name=" title" size=30 />

关键字:<input type="text" name="tags" size=30 />

内容: &nbsp;&nbsp;<textarea name="content" cols="30’ rows="5"/textarea>

<input type ="submit" name= "submit" value="提交 </form></body></html>

这是例子对应的HTML页面,主要由两个文本框和一个Textarea组成,用来让用户输入 Blog的文章名、关键字和内容。当用户输入完这3个数据之后,通过单击“提交”按钮来将刚 输入的数据提交给后台的服务器端,并由与URL 7”对应的Python脚本来进行处理,也就是 main.py。

四、编写数据库代码

在介绍数据库代码之前,先给大家简要介绍一下App Engine的实体模型和数据类型。

1. 实体模型

App Engine主要的数据模型为“实体模型”,其中一个实体由一个主键和一组属性组成, 而且每个属性可在多个数据类型中进行选择。实体模型是通过继承Model类来实现的。

2. 数据类型

主要的基本数据类型有字符串(String)、基于字节的字符串(ByteString)、布尔 (Boolean)、整数(Integer)、浮点数(Float)、日期时间(DateTime)、列表(List)、字 符串列表(StringList)、文本(Text)、二进制块(Blob)和用于表示实体之间关系的参考 类型(Reference)。除了基本的数据类型之外,用户还可以通过继承Expando类来自定义一 个新的数据类型。

3. Blog表的结构

Blog表共有3个字段,分别是字符串类型的title属性、字符串列表类型的tags属性和 文本类型的content属性。代码清单3-3是创建Blog表的blogdb.py脚本的代码。

代码清单3-3 blogdb.py

from google.appengine.ext import dbclass Blog(db.Model):title = db.StringProperty《} tags = db.StringListProperty{) content = db.TextProperty()def save{self, 一title, _tags, _content): blog = Blog() blog.title = —title blog.content = ^contentif _tags:blog.tags = _tags.split{ " M) else :blog.tags =[] blog.put()

这个脚本主要由两部分构成:其一是通过继承db.Model这个类来创建Blog这个实体模 型,并声明title、tags和content这3个属性;其二是定义一个名为save的方法,在 这个方法内首先创建一个新的Blog实体,之后将输入的_匕;11:1^、_tags和_〇:〇1^6111:这3 个参数插入到这个新创建的Blog实体中,并使用这个实体的put方法来在数据库中保存这个 实体。其他类可以通过调用Blog类中的这个save方法来存储和Blog相关的数据。还有在 将_^393插入到Bl〇g实体前,会通过split:(分割)方法将其从字符串形式转化为字符串列 表形式>

五、添加Web处理方法

在这个例子中,需要添加用于处理两个Web清求的代码:其…是用于显示mdex.html的代 码,也就是用于处理访问URL 的get请求;其二是保存用户在index.html上输入的Blog 数据,也就是用干处理访问URL“/”的post请求。代码清单3-4是添加上面两个逻辑之后main.py 的代码。

代码清单3-4 main.py

from google.appengine.ext import webappfrom google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.ext.webapp import template import os import cgifrom blogdb import Blogfrom google.appengine.ext import dbclass Main(webapp.RequestHandler):def get (self):path = os.path.join(os.path.dirname(_file_), 'index.html'  )seif.response.out.write(template.render(path, []))def post (self):_title = cgi.escape(self.request.get('titlef))—tags = cgi.escape(self.request.get('tags 1))—content = cgi.escape{self.request.get('content')) blog = Blog()blog.save(_title, _tags, _content) self.response.out.write('Save Successfully')application = webapp.WSGIApplication([(V, Main)], debug=True)def main():run_wsgi_app(application)if _name_ == "_main_":main()

从上到下,main.py的代码可分为3个部分。

□get方法。这个方法主要通过Python os模块的方法来读取index.htm丨,并将读取好的 index.html文件的内容通过HTTP响应流来发送给浏览器端,这样会在客户的浏览器上 显示 index.html。

□ post方法。这个方法会从输入的HTTP请求流中获取title、tags和content的输人 数据,并调用Blog这个实体模型中的save方法来保存,之后将返回Save Successfully 的消息给客户端。

口注册Main类。在代码中通过初始化webapp.WSGIApplication类来将Main类和URL “/”对应。比如,客户端发送Get请求给URL 7”,系统会调用Main类的Get方法来 处理这个请求。需要注意的是,这里设定URL和类的对应关系是在app.yaml中设定之 后的进一步设置。

代码部分已结束,下面将介绍如何测试和部署这个项目。

六、测试和部署

在测试和部署方面,主要有下面这3步。

1. 本地测试

通过调用SDK中的dev__appserver.py脚本来启动本地的开发环境,具体命令格式为 dev_appserver.pysample,这串.sample指代的是项目的名字。如果有Pydev这个插件,可 以在Eclipse上启动本地开发环境的调试模式。在成功启动环境之后,可通过“http://localhosf.8080” 这个URL来测试这个项目的基本功能。

2. 创建应用

图 3-6 是 App Engine 的管理界面(https://appengine.google.com/)中的 My Applications 奴 面,在这个页面上单击Create An Application按钮,进入“Create an Application”(创建应用)的界面,如图3-7所示。


123.png


1234.png

之后在Create an App丨ication界面中,在App丨ication Identifier文本框中输入应用的名字成 者IE> (必须是全App Engine唯-的),在Application Title文本框中输入应用的全称,之后_ 击Create Application按钮在App Engine上创建这个应用。

3.发布应用

使用SDK中的appcfg.py脚本将应用部署到App Engine平台上,具体命令格式为appefg. py update sample,这里sample代表项H所在的目录。部署之后,可以通过App Engine的管理界面来访问和管理应用。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广