Python 2 不再受社区支持。我们建议您将 Python 2 应用迁移到 Python 3

迁移捆绑的 App Engine 服务概览

App Engine 标准运行时中的 Python 3 运行时不包含 Memcache 和任务队列等捆绑式服务。相反,Google Cloud 提供了独立的产品,其作用相当于 Python 2 运行时中的大多数捆绑服务。对于在 Google Cloud 中不能作为单独产品(如图片处理,搜索和消息传递)提供的捆绑服务,本指南建议第三方提供商或其他解决方法。

本页面介绍了每项捆绑式服务的迁移路径。在未来的几个月里,我们将为其中一些服务提供详细的迁移指南。

了解 Google Cloud 权限

由于您迁移的应用及其使用的 Google Cloud 服务不再在同一“沙盒”环境中运行,因此您的应用需要获得授权才能访问各项服务。例如,如需与 Datastore 或 Cloud Tasks进行交互,您的应用需要提供有权访问这些服务的帐号的凭据。

默认情况下,App Engine 标准运行时中的应用会提供 App Engine 默认服务帐号的凭据,该帐号有权访问该应用所在项目中的数据库。

如果满足以下任何条件,则您需要使用明确提供凭据的备用身份验证技术:

  • 您的应用和 Memorystore 数据库位于不同的 Google Cloud 项目中。

  • 您已更改分配给默认 App Engine 服务帐号的角色。

如需了解备用身份验证技术,请参阅为服务器到服务器的生产应用设置身份验证

本地开发的身份验证

要在本地开发或测试您的应用,建议创建并使用服务帐号。请勿使用 App Engine 默认的服务帐号,因为它对您项目中的所有内容都有较高级别的权限。请创建并使用具有特定开发和测试任务所需的最低权限级别的服务帐户。

有关设置服务帐号并将其与应用关联的说明,请参阅手动获取和提供服务帐号凭据

安装客户端库

从 Python 应用使用 Google Cloud 服务的最简单方法是安装该服务的 Python 客户端库。(Google Cloud 服务还提供 JSON REST 和其他接口。) 对于 Python 2 应用和 Python 3 应用,将客户端库安装到 App Engine 运行时的步骤有所不同。

为 Python 2 应用安装库

要安装应用在 Python 2 运行时中运行时要使用的库,请执行以下操作:

  1. 创建一个用于存储第三方库的目录,如 lib/

  2. app.yaml 文件所在的文件夹中创建一个 requirements.txt 文件,并添加客户端库的名称以及 googleapis_common_protos 库:

    Python 2 应用需要 googleapis_common_protos 才能访问 Google Cloud 服务。

    例如,以下文件可用于为 googleapis_common_protos、Pub/Sub 和 Cloud Tasks 安装库:

    googleapis_common_protos
    google-cloud-pubsub
    google-cloud-tasks
    
  3. 使用 pip install 将库安装到您创建的文件夹中。 例如:

    pip install -t lib -r requirements.txt
    
  4. 在您应用的 app.yaml 文件的 libraries 部分中,指定 Google RPC 和 SSL 库:

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: ssl
      version: latest
    

    某些客户端库不需要 SSL 库。如果您没有为需要 SSL 库的客户端库添加 SSL 库,当您的应用收到请求时,您会在日志浏览器中看到 SSL 错误。

  5. 如果您还没有 appengine_config.py 文件,请在 app.yaml 文件所在的文件夹中创建此文件。将以下内容添加到 appengine_config.py 文件:

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    请务必使用 pkg_resources 模块,该模块确保您的应用会使用正确的客户端库发布版本。

    上例中的 appengine_config.py 文件假定 lib 文件夹位于当前工作目录中。如果您无法保证 lib 始终位于当前工作目录中,请指定 lib 文件夹的完整路径。例如:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    
  6. 部署应用

在您部署应用时,App Engine 会将您在 appengine_config.py 文件中指定的目录中的所有库上传到 Python 2。

为 Python 3 应用安装库

要安装应用在 Python 3 运行时中运行时要使用的库,请执行以下操作:

  1. 将库名称添加到应用的 requirements.txt文件中。例如:

    google-cloud-ndb
    
  2. 部署应用

App Engine 会自动将 requirements.txt 文件中列出的所有库上传到 Python 3 运行时。

App Engine 捆绑式服务的迁移路径

Blobstore

如需存储和检索数据,请通过 Google Cloud 客户端库使用 Cloud Storage。要开始使用,请参阅迁移至 Cloud 客户端库以进行存储

数据存储区

如果 Python 2 应用使用 NDB 与 Datastore 进行交互,请迁移到 Cloud NDB Python 3 库。新的 Python 3 应用应使用 Datastore 模式客户端库

有关详情,请参阅:

图片

您可以从 Cloud Storage 传送图片,直接传送图片或使用第三方内容分发网络 (CDN)。

要调整图片大小、转换和处理图片,请使用图片处理库(如 Pillow)或 ImageMapick 的 Python 接口)。 要使用其中一个第三方库,请将库添加为依赖项并更新代码以调用该库的 API。

App Engine Images 服务还通过使用传送网址处理图片大小调整来避免向应用发出动态请求。如果您想实现类似功能,可以提前重新调整图片大小,并将其上传到 Cloud Storage 以供传送。或者,您也可以使用具有调整图片大小功能的第三方内容分发网络 (CDN) 服务。

日志记录

我们建议您更新应用以使用 Cloud Logging,它支持以下功能,例如在日志浏览器中查看日志、下载日志、按严重程度过滤消息以及将应用消息与特定请求相关联。或者,您可以通过编写包含 JSON 对象结构形式的特定数据的日志消息,来启用这些功能。

如需了解详情,请参阅迁移到 Cloud Logging

Mail

如需发送电子邮件,请使用第三方邮件提供程序,例如 SendGridMailgunMailjet。所有这些服务都提供用于从应用发送电子邮件的 API。

Memcache

如果您的 Python 2 应用明确使用 Memcache,您需要先迁移到其他缓存解决方案,然后才能在 Python 3 环境中运行您的应用。我们建议您使用 Memorystore for Redis 作为缓存服务。 有关详情,请参阅将 Memcache 迁移到 Memorystore

模块

要获取信息并修改应用正在运行的服务,请结合使用环境变量和 App Engine Admin API:

服务信息 访问方式
当前应用 ID GAE_APPLICATION 环境变量
当前项目 ID GOOGLE_CLOUD_PROJECT 环境变量
当前服务名称 GAE_SERVICE 环境变量
当前服务版本 GAE_VERSION 环境变量
当前实例 ID GAE_INSTANCE 环境变量
默认主机名 Admin API apps.get 方法
服务列表 Admin API apps.services.list 方法
服务版本的列表 Admin API apps.services.versions.list 方法
默认的服务版本,包括流量拆分设置(如果有) Admin API apps.services.get 方法
正在运行的某版本实例的列表 Admin API apps.services.versions.instances.list 方法
如需详细了解您的应用在 Python 3 运行时中运行服务时可用的数据,请参阅 Python 3 运行时环境

命名空间

借助 Namespaces API,多租户应用只需为每个租户指定唯一的命名空间字符串,即可跨租户划分数据。

Datastore 直接支持多租户,但其他 Google Cloud 服务不支持。如果您的多租户应用使用其他 Google Cloud 服务,则需要手动处理多租户。要实现完全隔离的服务实例,您可以使用 Cloud Resource Manager API 以编程方式创建新项目,并访问不同项目的资源。

OAuth

请使用 OAuth 2.0 APIoauth2.tokeninfo 方法,而不是使用 App Engine OAuth 服务来验证 OAuth 2.0 令牌。

您可以托管任何全文搜索数据库,例如 Compute Engine 上的 Elasticsearch,并通过您的服务访问该数据库。

任务队列

将拉取队列迁移到 Pub/Sub 并将推送队列迁移到 Cloud 任务。 如果应用同时使用拉取和推送队列,请先迁移拉取队列,以防止 Cloud Tasks 出现意外行为。

有关执行这些迁移的详细信息,请参阅:

URL Fetch

默认情况下,Python 2.7 运行时使用 URL Fetch 服务处理出站 HTTP(S) 请求,即使您使用标准 Python 库发出这些请求也是如此。Python 3 运行时无需中间服务来处理出站请求,因此 URL Fetch 在 Python 3 运行时中不可用。

如果您的应用使用标准 Python 库发出请求并且 Python 3 运行时中缺少 URL Fetch,将不会影响应用发出请求。不过,我们建议您在不使用 URL Fetch 功能的环境中测试应用,以确保这一点。

如果应用直接使用 URL Fetch API(例如,发出异步请求),您需要迁移这些请求以使用 requests 等标准 Python 库。

如需了解详情,请参阅迁移出站请求

用户身份验证

如需替代 Users API,请使用任何基于 HTTP 的身份验证机制,例如: