google app engine for Python入门

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Google App Engine for Python
App Engine Python 概述
编程
欢迎使用 Google App Engine for Python!通过 App Engine,您可以使用Python
语言构建网络应用程序,并利用专业开发人员构建世界级网络应用程序所用的多种针对Python 的库、工具和框架。

您的 Python 应用程序将在 Google 的可扩展基础结构上运行,并使用大型持久性存储和服务。

以获得关于使用 Python和Google
使用入门指南
如果您尚未做好准备,请参阅Python
App Engine 来开发网络应用程序的交互性介绍。

Python 运行时环境
Python网络应用程序使用CGI 协议与App Engine网络服务器交互。

应用程序可以通过CGI 适配器使用 WSGI 兼容的网络应用程序框架。

App Engine 包含一个称为webapp 的
简单网络应用程序框架,使您易于上手。

对于较大的应用程序,诸如Django 的成熟第三方框架可很好地与 App Engine 配合使用。

App Engine 支持 Python 2.5。

Python 解释器在一个安全的“沙盒”环境下运行,以便隔离针对服务和安全的应用程序。

解释器可运行任何 Python 代码,包括您的应用程序中附带的 Python 模块以及 Python 标准库。

解释器不能载入具有C代码的 Python 模块,它是
一个“纯”Python 环境。

沙盒确保了应用程序仅执行不影响其他应用程序的性能和可伸缩性的操作。

例如,应用程序不能将数据写入本地文件系统中,也不能建立任意网络连接。

应用程序使用App Engine 提供的可扩展服务来存储数据并通过互联网进行通信。

当应用程序尝试从已知不受沙盒限制的标准库中导入模块时,Python 解释器引发异常。

环境
有关详细信息,请参阅CGI
数据存储区和服务
应用程序可以使用 App Engine数据存储区来实现可靠、可扩展的持久数据存储。

针对 App Engine 数据存储区的 Python API 包括用于管理数据架构的丰富的数据建模工具。

API 支持两种用于执行数据存储区查询的接口,包括也用于管理控制台的类似于 SQL 的查询语言 GQL。

App Engine Memcache 提供快速、暂时的分布式存储来缓存数据存储区查询和计算的结果。

针对 App Engine Memcache 的 Python 接口与 Python Memcached API 兼容。

应用程序使用网址抓取服务来访问网络资源,并且使用 HTTP 和 HTTPS 协议来与其他主机通信。

Python 应用程序可以使用来自 Python 标准库的urllib、urllib2 或ttplib
访问此服务,或者可以使用 App Engine 网址抓取服务 API。

应用程序可以使用邮件服务,以应用程序管理员或当前登录用户的身份发送电子邮件。

应用程序通过图像服务能够转换并处理一些格式的图像数据,包括修剪、旋转、调整大小和照片色彩增强。

进行用户验证。

Google 帐户处理用户帐户的创建和登录,已 帐户
应用程序可以使用Google
拥有 Google 帐户(如 GMail 帐户)的用户可以将该帐户与应用程序结合使用。

应用程序
可以检测到当前用户的登录时间,并且可以访问该用户的电子邮件地址。

Python API 可以
在能直接存储在数据存储区中的对象中返回用户数据。

计划任务
应用程序可以配置将以指定间隔时间调用应用程序网址的计划任务。

有关这一点的详细信息,请参阅Cron Job。

Python 工具
App Engine Python SDK 包括的工具可用于测试应用程序、上传应用程序文件、管理数据存储区索引、下载日志数据以及上传大量数据到数据存储区。

开发服务器在您的本地计算机上运行应用程序,以测试您的应用程序。

服务器模拟App Engine 数据存储区、服务和沙盒限制。

开发服务器还可以根据应用程序在测试期间执行的
查询生成数据存储区索引的配置。

称为appcfg.py 的多用途工具可处理与 App Engine 上所运行的应用程序之间的所有命令行交互。

appcfg.py 可将您的应用程序上传到App Engine,或者只是更新数据存储区索引配置,这样您可以在更新代码之前构建新的索引。

AppCfg 还可以下载应用程序的日志数据,
这样您可以使用自己的工具来分析应用程序的性能。

Python SDK 包括了一个数据上传工具,可将数据从您的本地数据文件添加到应用程序的数据存储区。

该工具可从 CSV 文件提取数据,CSV 是一种由大多数电子表格软件(如 Google 文档或 Microsoft Excel)所支持的电子表格格式。

您可以使用 Python 代码来自定义如何将 CSV 文件转换为数据存储区实体。

使用入门:Python
本辅导手册介绍了如何用 Google App Engine 开发和部署简单的 Python 项目。

留言簿这
一示例项目演示了如何使用 Python 运行时环境,以及如何使用一些App Engine服务,
包括数据存储区和 Google 用户服务。

本教程包含以下部分:
•简介
•开发环境
•Hello,World!
•使用webapp框架
•使用用户服务
•使用webapp处理表单
•使用数据存储区
•使用模板
•使用静态文件
•上传应用程序
简介
欢迎使用 Google App Engine!创建 App Engine 应用程序非常简单,只需几分钟时间,而且可以免费开始使用:立即上传您的应用程序并与用户共享,不需要支付费用也不需要承担什么义务。

Google App Engine应用程序可用Java或Python编程语言编写。

本辅导手册涉及Python。

如果您更习惯使用Java来构建应用程序,请参阅入门指南:Java。

在本辅导手册中,您将学习如何:
•使用 Python 构建 App Engine 应用程序
•使用“webapp”网络应用程序框架
•将App Engine 数据存储区和 Python 建模 API 配合使用
•将App Engine 应用程序与 Google 帐户集成以进行用户验证
•在您的应用程序中使用Django 模板
•将应用程序上传到App Engine
在本辅导手册结束前,您将实现一个可运行的应用程序:可让用户发布消息到公共留言板的简单留言簿。

下一步...
要开始开发 Google App Engine 应用程序,请下载并安装App Engine 软件开发工具包。

继续转至开发环境。

开发环境
使用 App Engine Python 软件开发套件 (SDK) 为 Google App Engine 开发和上传Python 应用程序。

Python SDK 包含模拟App Engine 环境的网络服务器应用程序,其中包括数据存储区的本地版本、Google 帐户,以及使用 App Engine API 从您的计算机直接抓取网址和发送电子邮件的功能。

Python SDK 可在装有 Python 2.5 的任意计算机上运行,并且有适合 Windows、Mac OS X 和 Linux 的版本。

下载和安装适合您的平台的 Python2.5。

Mac OS X10.5 网站
如有必要,请从Python
Leopard 用户已安装Python 2.5。

下载 App Engine SDK。

按照下载页面中的说明在计算机上安装SDK。

对于本教程,您将使用两个来自 SDK 的命令:
,开发网络服务器
•dev_appserver.py
,用于将您的应用程序上传到App Engine
•appcfg.py
对于 Windows 用户:Windows 安装程序会将这些命令置于命令路径中。

安装后,您可以从命令提示符运行这些命令。

对于 Mac 用户:Google App Engine 启动程序会将这些命令包含在应用程序中。

您可以通过从“GoogleAppEngineLauncher”菜单中选择“Make Symlinks...”将这些命令置于命令路径中。

或者,您可以使用启动程序来运行开发网络服务器并部署您的应用程序,而不必运行命令。

如果您使用 SDK 的 Zip 归档版本,您将在google_appengine目录中找到这些命令。

下一步...
通过本地开发环境,您可以在向外界推出App Engine 应用程序之前对其进行全面的开发和测试。

让我们写一些代码。

继续转至Hello, World!
Hello, World!
Python App Engine 应用程序使用CGI 标准与网络服务器通信。

当服务器收到来自应用程序的请求时,它使用环境变量和标准输入流(对于 POST 数据)中的请求数据运行应用程序。

为了做出响应,应用程序会向标准输出流写入响应,包括 HTTP 标头和内容。

让我们开始构建显示简短消息的小型应用程序。

创建简单请求处理程序
创建名为helloworld的目录。

该应用程序的所有文件都驻留在该目录中。

在helloworld目录中,创建名为helloworld.py的文件,并赋予其以下内容:
该Python 脚本会对带有 HTTP 标头(描述内容、空行和消息Hello, world!)的请求作出响应。

创建配置文件
App Engine 应用程序中包含名为app.yaml的配置文件。

除其他内容外,文件还介绍了哪个处理程序脚本应用于哪个网址。

在helloworld目录中,创建名为app.yaml的文件,内容如下:
从上到下,该配置文件描述了有关该应用程序的以下内容:
•应用程序标识符为helloworld。

当您在用 App Engine 注册应用程序的最后步骤时,您将选择唯一标识符,然后更新该值。

在开发过程中,该值可以是任意内容。

暂时将其设置保留为helloworld。

•这是该应用程序代码的版本号1。

如果您在上传新版本的应用程序软件之前调整了该内容,App Engine 将会保留之前的版本,并可让您使用管理控制台回滚到之前的版本。

•该代码运行于Python运行时环境中,版本为“1”。

将来可能支持其他运行时环境和语言。

•对路径与正则表达式/.*(所有网址)匹配的网址的所有请求应由helloworld.py脚本进行处理。

参考
该文件的语法为YAML。

有关配置选项的完整列表,请参阅app.yaml
测试应用程序
用处理程序脚本和配置文件将每个网址映射到处理程序后,应用程序就完成了。

您可以立即用 App Engine SDK 附带的网络服务器对其进行测试。

用以下命令启动网络服务器,向其提供到helloworld目录的路径:
网络服务器正在运行,在端口 8080 监听请求。

通过在网络浏览器中访问以下网址测试应用程序:
•http://localhost:8080/
有关运行开发网络服务器的详细信息(包括如何更改它使用哪个端口),请参阅开发网络服务器参考,或使用­­help选项运行命令。

重复开发
您可以在开发应用程序时保持网络服务器运行。

网络服务器将自动查看您源文件中的更改,并在必要时重新加载它们。

立即尝试:保持网络服务器运行,然后编辑helloworld.py以将Hello, world!更改为其他内容。

重新加载http://localhost:8080/以查看更改。

要关闭网络服务器,请确保终端窗口处于活动状态,然后按Control­C(或您的控制台上相应的“break”键)。

您可以使网络服务器在本教程的其余部分时保持运行。

如果您需要停止它,可以通过运行以上命令再次重新启动它。

下一步...
您现在完成了 App Engine 应用程序!您可以立即部署该简单问候并与全球用户共享。

但是在部署之前,让我们考虑使用网络应用程序框架来更轻松地添加功能。

继续转至使用 Webapp 框架。

使用webapp框架
CGI 标准很简单,但是手动编写使用该标准的所有代码将非常麻烦。

网络应用程序框架可以为您处理这些琐碎的事情,以便您可以将开发精力集中在应用程序的功能上。

Google Ap p Engine 支持用纯 Python(符合 CGI)编写的任何框架(以及使用 CGI 适配器的与WSGI 兼容的框架),包括Django、CherryPy、Pylons 和web.py。

可以通过将应用程序代码复制到应用程序目录来捆绑所选框架和应用程序代码。

App Engine 包括其自己的简单网络应用程序框架,称为webapp。

webapp框架已安装在 App Engine 环境和 SDK 中,因此无需将其与应用程序代码捆绑即可使用。

我们将使用webapp学习本教程的剩余部分。

Hello, webapp!
一个webapp应用程序包含三部分:
•一个或多个RequestHandler类,用于处理请求和构建响应
•一个WSGIApplication实例,按照网址将收到的请求发送给处理程序
•一个主要例行程序,用于使用 CGI 适配器运行WSGIApplication
现在让我们将友好的问候语重新编写为一个webapp应用程序。

编辑helloworld/helloworld. py,并将其内容替换为以下内容:
在浏览器中重新加载http://localhost:8080/,以了解正在使用的新版本。

(如果已停止您的网络服务器,请通过运行Hello, World!中介绍的命令来重新启动。


webapp的功能
webapp模块位于google.appengine.ext包中。

SDK 以及生产运行时环境中均提供该模块。

该代码定义一个映射到根网址(/)的请求处理程序MainPage。

当webapp收到网址/的HTTP GET 请求时,它会将MainPage类实例化并调用该实例的get方法。

在该方法中,可以使用self.request获得有关请求的信息。

通常情况下,该方法在self.response上设置属性以准备响应,然后退出。

webapp将基于MainPage实例的最终状态发送响应。

应用程序本身由webapp.WSGIApplication实例表示。

如果处理程序遇到错误或引发未捕捉的异常,则传递给其构造函数的参数debug=true将通知webapp将堆栈记录打印到浏览器输出。

您可能需要从应用程序的最终版本中删除此选项。

函数run_wsgi_app()使用 WSGIApplication 实例(或其他与 WSGI 兼容的应用程序对象)并在 App Engine 的 CGI 环境中运行此实例。

run_wsgi_app()与 Python 标准库中的wsgiref模块提供的从 WSGI 到CGI 的适配器相似,但前者包含其他几个功能。

例如,它可自动检测应用程序是在开发服务器中运行还是在 App Engine 上运行,如果在开发服务器上运行,则在浏览器中显示错误。

我们将在本教程的后面使用webapp的另外几个功能。

有关webapp的详细信息,请参阅 。

参考
webapp
下一步...
框架可以使网络应用程序的开发更简单、更快速以及发生更少的错误。

webapp只是这些可用于 Python 的框架中的一个。

既然我们要使用框架,那就添加一些功能。

继续转至使用用户服务。

使用用户服务
Google App Engine 提供基于 Google 基础架构的多种有用服务,可由使用 SDK 随附的库的应用程序访问。

其中一种服务是用户服务,可使应用程序与 Google 用户帐户集成。

使用用户服务,用户可以使用已有的 Google 帐户登录到您的应用程序。

我们来使用用户服务个性化此应用程序的问候语。

使用 Us er
再次编辑helloworld/helloworld.py,并将其内容替换为以下内容:
在您的浏览器中重新加载该页面。

应用程序会将您重定向到适用于测试应用程序的 Google 登录页面的本地版本。

您可以在该屏幕中输入自己喜欢的任何用户名,应用程序会基于该用户名发现伪造User对象。

当应用程序在 App Engine 上运行时,用户会被定向到Google 帐户登录页面,然后在成功登录或创建帐户后重定向到应用程序。

用户 API
我们来仔细了解一下用户 API 的新内容:
user = users.get_current_user()
如果用户已登录到您的应用程序,get_current_user()将为用户返回User对象。

否则,它会返回None。

如果用户已登录,将使用与用户的帐户关联的昵称显示个性化的消息。

如果用户尚未登录,则通知webapp将用户的浏览器重定向到Google 帐户登录屏幕。

这种重新定位包括本页面的网址 (self.request.uri),因此用户登录或注册了新帐户后,Google
帐户登录机制会引导用户返回到此处。

有关用户 API 的详细信息,请参阅用户参考。

下一步...
我们的应用程序现在可以按名称问候访问用户。

我们来添加一项功能以使用户可以相互问候。

继续转至使用 webapp 处理表单。

使用 webapp处理表单
如果我们希望用户能够发布自己的问候,我们需要一种方法来处理用户使用网络表单提交的信息。

使用webapp框架可以轻松地处理表单数据。

用 webapp处理网络表单
用以下内容替换helloworld/helloworld.py的内容:
重新加载页面以查看表单,然后尝试提交邮件。

该版本有两个处理程序:映射到网址/的MainPage,显示网络表单。

映射到网址/sign的Guestbook,显示网络表单提交的数据。

Guestbook处理程序使用post()方法而不是get()方法。

这是因为MainPage显示的表单使用 HTTP POST 方法(method="post") 来提交表单数据。

如果由于一些原因您需要一个处理程序来处理对同一网址的 GET 和 POST 操作,您可以为相同类中的每个操作定义一种方法。

post()方法的代码从self.request获取表单数据。

在把它重新显示给用户之前,它会使用cgi. escape()来将 HTML 特殊字符转义为相应的对等字符实体。

cgi是标准 Python 库中的模块;有关详细信息,请参阅cgi 文档。

下一步...
既然我们可以从用户收集信息,那么我们还需要放置信息的位置和取回信息的方法。

继续转至使用数据存储区。

使用数据存储区
将数据存储在可扩展的网络应用程序中可能会非常复杂。

用户可在指定时间与任意数量的网络服务器进行交互,并且该用户的下一个请求可能会转到与处理上一个请求不同的网络服务器上。

所有网络服务器都需要与同样分布在多个机器(可能位于世界各地的不同位置)上的数据进行交互。

有了 Google App Engine,您就不必再为上述任何问题担心了。

App Engine 的基础架构通过一个简单的 API 就能处理好数据的所有分布、复制和负载平衡,同时您还可获得一个功能强大的查询引擎和事务处理。

使用数据存储区的完整示例
以下是新版本的helloworld/helloworld.py,它将问候语存储在数据存储区中。

本页的其余部分讨论了新的内容。

将helloworld/helloworld.py替换为如上,然后在浏览器中重新载入
http://localhost:8080/。

发布一些消息以确认消息能正确地存储和显示。

存储提交的问候语
的数据建模
App Engine 包括一个针对 Python 的数据建模 API。

它类似于Django
API,不同的是它在后台使用 App Engine 的可扩展数据存储区。

对于留言簿应用程序,我们希望存储用户发布的问候语。

每个问候语都包括作者的姓名、消息内容以及消息发布的日期和时间,以便我们可以按时间顺序显示消息。

要使用该数据建模 API,请导入google.appengine.ext.db 模块:
from google.appengine.ext import db
下文定义了问候语的数据模型:
这定义了一个具有以下三个属性的Greeting模型:值为User对象的author、值为字符串的content以及值为datetime.datetime的date。

有些属性构造函数将使用参数进一步配置其行为。

为db.StringProperty构造函数提供mul tiline=True参数表示该属性的值可以包含换行符。

为db.DateTimeProperty构造函数提供 auto_now_add=True参数会将模型配置为创建对象时自动为新对象提供date(如果应用程序未以其他方式提供值)。

有关属性类型及其选项的完整列表,请参阅数据存储区参考。

有了问候语的数据模型后,应用程序即可使用该模型创建新的Greeting对象并将这些对象放置在数据存储区中。

以下新版本的Guestbook处理程序新建了问候语并将其存储到数据存储区:
此新的Guestbook处理程序将创建一个新的Greeting对象,然后使用用户所发布的数据设置该对象的author和content属性。

它不会设置date属性,因此按照我们所配置的模型的行为,date 将自动设置为“现在”。

最后,greeting.put()会将新对象保存到数据存储区中。

如果我们是通过查询获得的该对象,则put()将更新现有对象。

使用 Model 构造函数创建该对象以后,put()会将新对象添加到数据存储区中。

使用 GQL检索存储的问候语
App Engine 数据存储区有一个用于数据模型的成熟查询引擎。

App Engine 数据存储区不是传统的关系数据库,因此不使用 SQL 指定查询。

您可以替代使用类似 SQL 的查询语言(称为 GQL)进行查询。

GQL 使用一种熟悉的语法提供对 App Engine 数据存储区查询引擎功能的访问。

以下新版本的MainPage处理程序在数据存储区中查询问候语:
在下面这一行上进行查询:
也可以调用G ree t ing类中的g q l(...)方法,并忽略查询中的S ELECT*FR OM G ree t ing:
使用 SQL 时,关键字(例如SELECT)不区分大小写。

但名称区分大小写。

由于查询返回的是全数据对象,因此从模型中选择特定属性没有任何意义。

所有 GQL 查询均以SELECT * FROM model开头(或者由模型的 gql(...) 方法如此暗含),以接近其 S QL 等价表达式。

GQL 查询可以含有WHERE子句,以基于属性值按一个或多个条件过滤结果集。

与 SQL 不同,GQL 查询不能含有值常量;而是对查询中的所有值都使用参数绑定。

例如,要仅获得当前用户发布的问候语:
还可以使用命名参数而不是位置参数:
除了 GQL 之外,数据存储区 API 还提供了使用方法构建查询对象的其他机制。

上述查询还可以准备如下:
有关 GQL 和查询 API 的完整描述,请参阅数据存储区参考。

清除开发服务器数据存储区
开发网络服务器使用本地版本的数据存储区以通过临时文件来测试应用程序。

只要临时文件存在,数据就存在,并且网络服务器不会重设这些文件,直到您要求重设。

如果希望开发服务器在启动前清除其数据存储区,请在启动该服务器时使用
--clear_da t a st ore选项:
下一步...
现在,我们有了一个工作留言簿应用程序,用于对使用 Google 帐户的用户进行身份验证、使用户可以提交消息以及显示其他用户留下的消息。

App Engine 自动处理扩展,因此我们
不需要随着我们的应用程序逐渐普及而重新访问该代码。

该最新版本将 HTML 内容与MainPage处理程序的代码混合起来。

这使得更改应用程序的
外观变得很困难,尤其是当应用程序变得更大且更复杂时。

让我们使用模板来管理外观,并引入 CSS 样式表的静态文件。

继续转至使用模板。

使用模板
嵌入代码中的 HTML 杂乱且难以维护。

最好使用模板系统,在模板系统中,HTML 会保
存在单独的文件中,且使用特殊语法来表示来自应用程序的数据要显示的位置。

适用于 Pyt hon 的模板系统有很多:EZT、Cheetah、ClearSilver、Quixote 和Django,而这些只是
其中的一小部分。

您可以通过将选择的模板引擎与您的应用程序代码绑定来使用该模板引擎。

方便起见,webapp模块将包含 Django 的模板引擎。

这包括在 SDK 中,并且是 App En gine 的一部分,因此您无需将其绑定便可使用它。

使用 Dj ango 模板
在h elloworld/h elloworld.p y顶部添加以下impor t语句:
用类似以下的代码替换Main P age处理程序:
最后,在helloworld目录中创建一个名为index.html的新文件,内容如下:
重新加载该页面并进行尝试。

t empla t e.render(pa th,t empla t e_v al u e s)将获取到该模板文件的文件路径和值参照表,然后返回呈现的文本。

该模板使用 Dj ango 模板语法来访问值并将这些值进行循环,而且可以参考这些值的属性。

在许多情况下,您可以将数据存储区 Model 对象作为值直接传递,并从模板访问其属性。

有关Django模板引擎的详细信息,请参阅Django 0.96。

模板文档
下一步...
每个网络应用程序都可通过模板或一些其他机制,返回从应用程序代码动态生成的 HTML。

大部分网络应用程序还需要提供静态内容,例如图像、CSS 样式表或 JavaScript 文件。

为了提高效率,App Engine 对静态文件的处理方式与对应用程序源和数据文件的处理方式不同。

您可以使用 App Engine 的静态文件功能来为该应用程序提供 CSS 样式表。

继续转至使用静态文件。

使用静态文件
与传统网络托管环境不同,Google App Engine 不直接在您的应用程序的源目录之外提供文件,除非被配置为可进行此项操作。

我们将模板文件命名为index.html,但这不会自动使该文件
在网址/index.html上可用。

但在许多情况下,您希望将静态文件直接提供给网络浏览器。

通常,图像、CSS 样式表、Ja vaScript 代码、电影和 Flash 动画都使用网络应用程序存储并直接提供给浏览器。

您可以命
令App Engine 直接提供特定文件,而不必对自己的处理程序进行编码。

使用静态文件
编辑helloworld/app.yaml并使用以下内容替换其内容:
新handlers部分为网址定义了两个处理程序。

当 App Engine 收到网址以/stylesheets开头的
请求时,App Engine 会将路径的剩余部分映射至stylesheets 目录中的文件,而且如果找到了相应的文件,该文件的内容就会返回至客户端。

其他所有网址将与/路径相匹配,并由hellow orld.py脚本进行处理。

默认情况下,App Engine 会根据文件扩展名使用 MIME 类型提供静态文件。

例如,会以
text/css MIME 类型提供名称以.css结尾的文件。

您可以用其他选项配置明确的 MIME 类型。

相关文档
最新文档