您可以使用本地开发服务器模拟在生产环境中运行 App Engine 应用,并使用它来访问 App Engine 捆绑服务。
该模拟环境实施一些沙盒限制,如受限制的系统功能和 Python 2 模块导入,但没有请求超时或配额之类的其他限制。
本地开发服务器还会模拟由 App Engine SDK 库提供的服务(包括 Datastore、Memcache 和任务队列),在本地执行其任务。当您的应用在开发服务器中运行时,您仍然可以使用 Google API HTTP 端点对生产基础架构进行远程 API 调用。
准备工作
由于 Python 2.7 已达到支持终止期限,因此您无法再使用最新版本的 dev_appserver.py
在本地运行应用。如需下载 devapp_server.py
的归档版本,请按照以下步骤操作:
从归档中,下载已达到支持终止期限的运行时的
dev_appserver.py
服务器所在的压缩文件夹。将目录的内容解压缩到本地文件系统,例如解压缩到
/home
目录。您可以在google_appengine/
目录中找到dev_appserver.py
。
设置本地开发服务器
如需运行本地开发服务器工具,您必须设置以下内容:
验证您是否安装了 2.7.12 或更高版本的 Python 2 解释器。
将 shell 中的
DEVAPPSERVER_ROOT
环境变量设置为 Python 2 解释器的路径。
运行本地开发服务器
设置本地开发服务器并为应用创建 app.yaml
配置文件后,您可以使用 dev_appserver.py
命令在本地运行应用。
如需启动本地开发服务器,请执行以下操作:
在包含
app.yaml
配置文件的目录中,运行dev_appserver.py
命令。指定应用的目录路径,例如:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py [PATH_TO_YOUR_APP]
或者,您可以指定特定服务的配置文件,例如:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py app.yaml
如需更改端口,请添加
--port
选项:python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]
将
[DEVAPPSERVER_ROOT]
替换为您在其中解压缩devapp_server.py
的归档版本的文件夹的路径。如需详细了解
dev_appserver.py
命令选项,请参阅本地开发服务器选项。本地开发服务器现已运行并侦听请求。您可以通过使用网络浏览器访问 http://localhost:8080/ 来查看应用的运行情况。
如果您使用
--port
选项指定了自定义端口,请记得在浏览器中指向该端口。
如需通过命令行停止本地服务器,请按以下组合键:
- macOS 或 Linux:Control+C
- Windows:Control+Break
指定应用 ID
如需在本地服务器中获取您的应用 ID(例如,用于模仿某个电子邮件地址),请使用 get_application_id()
函数。如需获取运行中应用的主机名,请使用 get_default_version_hostname()
函数。
检测应用运行时环境
如需确定您的代码是在生产环境中运行还是在本地开发服务器中运行,您可以检查 SERVER_SOFTWARE
方法的值。
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
# Production
else:
# Local development server
使用本地 Datastore
本地开发服务器使用在本地服务器调用期间保持不变的本地文件来模拟 App Engine Datastore。
如需详细了解索引和 index.yaml
,请参阅 Datastore 索引和 Datastore 索引配置页面。
浏览本地 Datastore
如果您的应用已使用本地开发服务器将数据写入本地数据存储区,您可以在本地开发控制台中浏览该数据。
如需浏览本地数据存储区,请执行以下操作:
在本地开发控制台中访问 Datastore 查看器。(网址为
http://localhost:8000/datastore
。)查看本地 Datastore 内容。
指定 ID 分配政策
对于生产 App Engine,您可以将 Datastore 设置为自动生成实体 ID。
虽然生产服务器的自动 ID 分配政策与开发服务器所用的政策完全不同,但您也可以为本地服务器设置自动 ID 分配政策。
如需指定自动 ID 分配政策,请使用 --auto_id_policy
选项:
python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --auto_id_policy=sequential
您需要进行如下替换:
将 DEVAPPSERVER_ROOT 替换为您在其中解压缩
devapp_server.py
的归档版本的文件夹的路径。将
--auto_id_policy
替换为以下项之一:scattered
:从大致均匀分布的整数的非重复序列分配(默认)ID 时。sequential
:从连续整数序列分配 ID 时。
清除本地 Datastore
如需清除应用的本地数据存储区,请按如下方式调用本地开发服务器:
python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --clear_datastore=yes app.yaml
将 DEVAPPSERVER_ROOT 替换为您在其中解压缩 devapp_server.py
的归档版本的文件夹的路径。
更改本地 Datastore 位置
如需更改用于数据存储区文件的位置,请使用 --datastore_path
选项:
python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml
将 DEVAPPSERVER_ROOT 替换为您在其中解压缩 devapp_server.py
的归档版本的文件夹的路径。
使用 Users 服务
App Engine 提供 Users 服务来简化应用的身份验证和授权。本地开发服务器使用自己的账号登录和退出页面模拟 Google 账号的行为。在本地开发服务器上运行时,users.create_login_url
和 users.create_logout_url
函数会返回本地服务器上 /_ah/login
和 /_ah/logout
的网址。
使用 Mail
借助 SMTP 服务器或本地安装的 Sendmail,本地开发服务器可以在收到 App Engine Mail 服务调用时发送电子邮件。
使用 SMTP
要使用 SMTP 服务器实现邮件支持,请按如下方式调用 dev_appserver.py
:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --smtp_host=smtp.example.com --smtp_port=25 \
--smtp_user=ajohnson --smtp_password=k1tt3ns [PATH_TO_YOUR_APP]
您需要进行如下替换:
- 将
[DEVAPPSERVER_ROOT]
替换为您在其中解压缩devapp_server.py
的归档版本的文件夹的路径。 - 将
--smtp_host
、--smtp_port
、--smtp_user
和--smtp_password
选项替换为您自己的配置值。
使用 Sendmail
要使用 Sendmail 实现邮件支持,请按如下方式调用 dev_appserver.py
:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]
将 [DEVAPPSERVER_ROOT]
替换为您在其中解压缩 devapp_server.py
的归档版本的文件夹的路径。
本地服务器将使用 sendmail
命令(采用您的默认安装配置)发送电子邮件。
使用 URL Fetch
如果您的应用使用 URL Fetch API 发出 HTTP 请求,本地开发服务器会直接从您的计算机中发出该请求。如果您使用代理服务器访问网站,则本地服务器上的 URL Fetch 行为可能与 App Engine 生产环境中的行为不同。
使用交互式控制台
通过交互式控制台,开发者可将任意 Python 代码输入 Web 表单,并在其应用的环境内部执行;交互式控制台提供的应用环境及服务访问权限与应用自身内部的 .py 文件相同。
要使用交互式控制台,请执行以下操作:
在本地开发控制台中访问交互式控制台。(网址为
http://localhost:8000/console
。)在文本区域中输入您想要运行的任意 Python 代码,然后提交表单以执行这段代码。例如,以下代码将添加一个名为
Greeting
且文本内容为Hello
的 Datastore 实体:from google.appengine.ext import ndb class Greeting(ndb.Model): content = ndb.TextProperty() e = Greeting(content="Hello") e.put()
使用 Python 调试程序进行调试
如需使用 Python 调试程序 (pdb
),请执行以下操作:
在您的代码中添加以下行:
import pdb; pdb.set_trace();
此时
dev_appserver
将中断并进入pdb
REPL(读取-求值-输出循环),允许您从命令行调试代码。如果您的应用同时发出多个调用
pdb.set_trace()
的请求,则多个调试会话将并发启动,且每个会话将输出发送到STDOUT
。为避免此情况,请通过停用dev_appserver
多线程和多处理支持以对请求进行序列化,如下所示:停用多线程:
- 使用
--threadsafe_override=false
标志停用所有服务的多线程。 - 使用
--threadsafe_override=<SERVICENAME>:false
标志停用一项服务的多处理。 - 使用
--threadsafe_override=<SERVICE1NAME>:false,<SERVICE2NAME>:false
标志停用多项服务的多处理。
- 使用
停用多处理:
- 使用
--max_module_instances=1
标志停用所有服务的多处理。 - 使用
--max_module_instances=<SERVICENAME>:1
标志停用一项服务的多处理。 - 使用
--max_module_instances=<SERVICE1NAME>:1,<SERVICE2NAME>:1
标志停用多项服务的多处理。
- 使用