默认情况下,Python 2.7 运行时使用 URL Fetch 服务处理出站 HTTP(S) 请求,即使您使用 urllib
、urllib2
或 httplib
Python 库发出这些请求也是如此。除非明确启用,否则 URL Fetch 不会处理来自 requests
库的请求。
Python 3 运行时无需中间服务来处理出站请求。如果您想停止使用 URL Fetch API,但仍需要类似的功能,则应迁移这些请求以使用标准 Python 库,例如 requests
库。
URL Fetch 与标准 Python 库之间的主要区别
通过 URL Fetch,当您的应用向另一个 App Engine 应用发送请求时,URL Fetch 会添加
X-Appengine-Inbound-Appid
请求标头声明应用的身份。接收请求的应用可以使用该身份来确定是否应处理该请求。如果您的应用使用 URL Fetch,则此标头仅在从您的应用发送的请求中可用。如果您或第三方将标头添加到请求,App Engine 会移除该标头。
如需了解如何在不使用 URL Fetch 的情况下声明和验证身份,请参阅将 App Identity 迁移到 OIDC ID 令牌。
如需查看在 App Engine 应用之间发送请求时如何使用请求标头来验证调用应用的身份的示例,请参阅 App Engine 到 App Engine 请求示例。
您可以使用 URL Fetch 设置所有请求的默认超时。大多数 Python 3 库(例如
requests
和urllib
)将默认超时设置为None
,因此您应该更新您的代码发出的每个请求以指定超时。
迁移过程概览
如果您的应用使用 URL Fetch API 发出请求,请更新您的代码以使用标准 Python 库。我们建议您为每个请求指定超时。
在本地开发服务器中测试出站请求。
将您的应用配置为在 App Engine 中运行时绕过 URL Fetch。
部署应用。
使用 Python 库替换 URL Fetch API
如果您还没有使用标准 Python 库来发出传出请求,请选择库并将其添加到应用的依赖项中。
例如,如需使用 Requests 库,请在
app.yaml
文件所在的文件夹中创建一个requirements.txt
文件,并添加以下行:requests==2.24.0
为了与 Python 2 兼容,我们建议您将
requests
库固定为 2.24.0 版。部署应用时,App Engine 将下载requirements.txt
文件中定义的所有依赖项。对于本地开发,我们建议您在虚拟环境(例如 venv)中安装依赖项。
在代码中搜索使用
google.appengine.api.urlfetch
模块的地方,并更新代码以使用 Python 库。
发出简单 HTTPS 请求
以下示例展示了如何使用 requests
库发出标准 HTTPS 请求:
发出异步 HTTPS 请求
以下示例展示了如何使用 requests
库发出异步 HTTPS 请求:
在本地测试
如果您更新任何出站请求,请在本地开发服务器中运行应用并确认请求成功。
绕过 URL Fetch
在向 App Engine 部署应用时,如需阻止 URL Fetch 处理请求,请执行以下操作:
在
app.yaml
文件中,将GAE_USE_SOCKETS_HTTPLIB
环境变量设置为任意值。该值可以是任何值,包括空字符串。 例如:env_variables: GAE_USE_SOCKETS_HTTPLIB : ''
如果您启用了 URL Fetch 来处理从
requests
库发送的请求,您可以从应用中移除 RequestsAppEngineAdapter
。例如,从
appengine_config.py
文件移除requests_toolbelt.adapters.appengine
,并从 Python 文件移除requests_toolbelt.adapters.appengine.monkeypatch()
。
请注意,即使您按照前面的步骤绕过 URL Fetch,您的应用仍然可以直接使用 URL Fetch API。
部署应用
准备好部署应用后,您应该执行以下操作:
-
查看 Google Cloud Console 中的“App Engine 配额”页面,以确认应用没有进行 URL Fetch API 调用。
如果应用运行正常(没有错误),请使用流量拆分功能为更新后的应用缓慢增加流量。请先仔细监控应用是否存在任何问题,然后再将更多流量路由到更新后的应用。