使用本地开发服务器

Google Cloud CLI 包含一个本地开发服务器 (dev_appserver.py)。您可以使用本地开发服务器模拟在 App Engine 生产环境中运行应用,并使用它来访问 App Engine 捆绑服务。

该模拟环境实施一些沙盒限制,如受限制的系统功能和 Python 2 模块导入,但没有请求超时或配额之类的其他限制。

本地开发服务器还会模拟由 App Engine SDK 库提供的服务(包括 Datastore、Memcache 和任务队列),在本地执行其任务。当您的应用在开发服务器中运行时,您仍然可以使用 Google API HTTP 端点对生产基础架构进行远程 API 调用。

运行本地开发服务器

为应用创建 app.yaml 配置文件后,您可使用 dev_appserver.py 命令启动本地开发服务器以在本地运行您的应用。

如需启动本地开发服务器,请执行以下操作:

  1. 在包含 app.yaml 配置文件的目录中,运行 dev_appserver.py 命令。如果 Python 2 不是您系统上的默认解释器,则您需要运行 python2 dev_appserver.py 以确保使用 Python 2 解释器。

    指定应用的目录路径,例如:

      dev_appserver.py [PATH_TO_YOUR_APP]
    

    或者,您可以指定特定服务的配置文件,例如:

      dev_appserver.py app.yaml
    

    如需更改端口,请添加 --port 选项:

      dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]
    

    dev_appserver.py 是否无法正常运行?

    如需详细了解 dev_appserver.py 命令选项,请参阅本地开发服务器选项

  2. 本地开发服务器现已运行并侦听请求。您可以通过使用网络浏览器访问 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

如果您的应用已使用本地开发服务器将数据写入本地数据存储区,您可以在本地开发控制台中浏览该数据。

如需浏览本地数据存储区,请执行以下操作:

  1. 启动开发服务器

  2. 在本地开发控制台中访问 Datastore 查看器。(网址为 http://localhost:8000/datastore。)

  3. 查看本地 Datastore 内容。

指定 ID 分配政策

对于生产 App Engine,您可以将 Datastore 设置为自动生成实体 ID

虽然生产服务器的自动 ID 分配政策与开发服务器所用的政策完全不同,但您也可以为本地服务器设置自动 ID 分配政策。

如需指定自动 ID 分配政策,请使用 --auto_id_policy 选项:

dev_appserver.py --auto_id_policy=sequential

其中 --auto_id_policy 可以是以下任一项:

  • scattered:(默认)ID 从大致均匀分布的整数的非重复序列分配。
  • sequential:使用连续整数序列来分配 ID。

清除本地 Datastore

如需清除应用的本地数据存储区,请按如下方式调用本地开发服务器:

dev_appserver.py --clear_datastore=yes app.yaml

更改本地 Datastore 位置

如需更改用于数据存储区文件的位置,请使用 --datastore_path 选项:

dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml

使用 Users 服务

App Engine 提供 Users 服务来简化应用的身份验证和授权。本地开发服务器使用自己的帐号登录和退出页面模拟 Google 帐号的行为。在本地开发服务器上运行时,users.create_login_urlusers.create_logout_url 函数会返回本地服务器上 /_ah/login/_ah/logout 的网址。

使用邮件

借助 SMTP 服务器或本地安装的 Sendmail,本地开发服务器可以在收到 App Engine Mail 服务调用时发送电子邮件。

使用 SMTP

要使用 SMTP 服务器实现邮件支持,请按如下方式调用 dev_appserver.py

dev_appserver.py --smtp_host=smtp.example.com --smtp_port=25 \
    --smtp_user=ajohnson --smtp_password=k1tt3ns [PATH_TO_YOUR_APP]

其中,您可以将 --smtp_host--smtp_port--smtp_user--smtp_password 选项设置为您自己的值。

使用 Sendmail

要使用 Sendmail 实现邮件支持,请按如下方式调用 dev_appserver.py

dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]

本地服务器将使用 sendmail 命令(采用您的默认安装配置)发送电子邮件。

使用 URL Fetch

如果您的应用使用 URL Fetch API 发出 HTTP 请求,本地开发服务器会直接从您的计算机中发出该请求。如果您使用代理服务器访问网站,则本地服务器上的网址提取行为可能与生产 App Engine 上的行为不同。

使用交互式控制台

通过交互式控制台,开发者可将任意 Python 代码输入 Web 表单,并在其应用的环境内部执行;交互式控制台提供的应用环境及服务访问权限与应用自身内部的 .py 文件相同。

要使用交互式控制台,请执行以下操作:

  1. 启动开发服务器

  2. 在本地开发控制台中访问交互式控制台。(网址为 http://localhost:8000/console。)

  3. 在文本区域中输入您想要运行的任意 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),请执行以下操作:

  1. 在您的代码中添加以下行:

    import pdb; pdb.set_trace();
    

    此时 dev_appserver 将中断并进入 pdb REPL(读取-求值-输出循环),允许您从命令行调试代码。

  2. 如果您的应用同时发出多个调用 pdb.set_trace() 的请求,则多个调试会话将并发启动,且每个会话将输出发送到 STDOUT。为避免此情况,请通过停用 dev_appserver 多线程和多处理支持以对请求进行序列化,如下所示:

    1. 停用多线程:

      • 使用 --threadsafe_override=false 标志停用所有服务的多线程。
      • 使用 --threadsafe_override=<SERVICENAME>:false 标志停用一项服务的多处理。
      • 使用 --threadsafe_override=<SERVICE1NAME>:false,<SERVICE2NAME>:false 标志停用多项服务的多处理。
    2. 停用多处理:

      • 使用 --max_module_instances=1 标志停用所有服务的多处理。
      • 使用 --max_module_instances=<SERVICENAME>:1 标志停用一项服务的多处理。
      • 使用 --max_module_instances=<SERVICE1NAME>:1,<SERVICE2NAME>:1 标志停用多项服务的多处理。