1. 概览
这一系列的 Codelab(自定进度的动手教程)旨在帮助开发者了解在部署应用时可用的各种选项。在本 Codelab 中,您将学习如何将 Google Cloud Translation API 与 Python 搭配使用,并在本地运行或部署到 Cloud 无服务器计算平台(App Engine、Cloud Functions 或 Cloud Run)。本教程代码库中提供的示例应用可以通过至少 8 种不同的方式部署,只需进行一些细微的配置更改即可:
- 本地 Flask 服务器 (Python 2)
- 本地 Flask 服务器 (Python 3)
- App Engine(Python 2)
- App Engine (Python 3)
- Cloud Functions (Python 3)
- Cloud Run(通过 Docker 运行 Python 2)
- Cloud Run(通过 Docker 运行 Python 3)
- Cloud Run(通过 Cloud Buildpack 使用 Python 3)
此 Codelab 将重点介绍如何将此应用部署到上文中加粗的平台。
您将了解如何
- 使用 Google Cloud API,尤其是 Cloud Translation API(高级版/v3)
- 在本地运行基本 Web 应用,或部署到 Cloud 无服务器计算平台
所需条件
- Google Cloud 项目,且拥有有效的 Cloud Billing 账号
- 安装了 Flask 以在本地运行,或启用了 Cloud 无服务器计算平台以进行云端部署
- 基本 Python 技能
- 基本操作系统命令的实践知识
调查问卷
您打算如何使用本教程?
您如何评价使用 Python 的体验?
您如何评价自己在使用 Google Cloud 服务方面的经验水平?
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
3. 启用 Translation API
在本部分中,您将学习如何常规地启用 Google API。对于我们的示例应用,您需要启用 Cloud Translation API 和 Cloud Functions 服务。
简介
无论您想在应用中使用哪些 Google API,都必须启用这些 API。以下示例展示了启用 Cloud Vision API 的两种方法。了解如何启用一个 Cloud API 后,您就可以启用其他 API,因为流程类似。
方法 1:通过 Cloud Shell 或命令行界面
虽然通过 Cloud 控制台启用 API 更为常见,但有些开发者更喜欢通过命令行执行所有操作。为此,您需要查找 API 的“服务名称”。它看起来像网址:SERVICE_NAME
.googleapis.com
。您可以在支持的产品图表中找到这些产品,也可以使用 Google Discovery API 以编程方式查询这些产品。
掌握这些信息后,您可以使用 Cloud Shell(或安装了 gcloud
命令行工具的本地开发环境)启用 API,如下所示:
gcloud services enable SERVICE_NAME.googleapis.com
例如,以下命令会启用 Cloud Vision API:
gcloud services enable vision.googleapis.com
此命令会启用 App Engine:
gcloud services enable appengine.googleapis.com
您还可以通过一个请求启用多个 API。例如,以下命令行可启用 Cloud Run、Cloud Artifact Registry 和 Cloud Translation API:
gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com
方法 2:通过 Cloud 控制台
您还可以在 API 管理器中启用 Vision API。在 Cloud 控制台中,前往 API 管理器,然后选择库。
如果您想启用 Cloud Vision API,请在搜索栏中开始输入“vision”,系统会显示与您输入内容匹配的所有内容:
选择要启用的 API,然后点击启用:
费用
虽然许多 Google API 可免费使用,但Google Cloud 产品和 API 并非免费。启用 Cloud API 时,系统可能会要求您提供有效的结算账号。不过,请务必注意,某些 Google Cloud 产品提供“始终免费”层级(按天/月),您必须超出此层级才能产生结算费用;否则,系统不会向您的信用卡(或指定的结算工具)收费。
用户应先查看任何 API 的价格信息,然后再进行启用,尤其是要注意该 API 是否提供免费层级,如果提供,具体是怎样的。如果您要启用 Cloud Vision API,请查看其价格信息页面。Cloud Vision 确实有免费配额,只要您在总体上(每个月内)不超出配额,就不会产生任何费用。
Google API 的价格和免费层级各不相同。示例:
- Google Cloud/GCP - 每种产品的计费方式不同,通常按 vCPU 周期、存储空间使用量、内存用量或按使用量付费;请参阅上文中的免费层级信息。
- Google 地图 - 提供一套 API,并向用户提供总计 200 美元的每月免费赠金。
- Google Workspace(以前称为 G Suite)API - 提供免费使用(上限为特定限制)的服务,费用包含在 Workspace 每月订阅费用中,因此无需直接付费即可使用 Gmail、Google 云端硬盘、Google 日历、Google 文档、Google 表格和 Google 幻灯片 API。
不同 Google 产品的结算方式有所不同,因此请务必参阅 API 的文档了解相关信息。
摘要
现在,您已经了解了如何常规启用 Google API,请前往 API 管理器,同时启用 Cloud Translation API 和 Cloud Functions 服务(如果您尚未启用)。我们应用将使用后者,而您要部署 Cloud Functions,因此需要启用前者。如果您希望通过命令行执行此操作,请改为发出以下命令:
gcloud services enable cloudfunctions.googleapis.com translate.googleapis.com
虽然“始终免费”层级的总摘要页面中未列出其每月配额,但Translation API 的价格页面指出,所有用户每月可获得固定数量的译文字符。如果您未达到该阈值,则不会产生任何 API 费用。如果还有任何其他与 Google Cloud 相关的扣款,我们会在最后的“清理”部分中加以说明。
4. 获取示例应用代码
在本地或 Cloud Shell 中(使用 git clone
命令)克隆 代码库中的代码,或点击其绿色的 Code 按钮下载 ZIP 文件,如以下屏幕截图所示:
现在,您已经完成了所有准备工作,接下来请创建该文件夹的完整副本,以便完成本教程,因为本教程可能涉及删除或更改文件。如果您想进行其他部署,可以先复制原始项目,然后从头开始,这样就不必重新克隆或下载。
5. 示例应用导览
示例应用是一个简单的 Google 翻译派生应用,会提示用户输入英语文本,并接收该文本的相应西班牙语译文。现在,打开 main.py
文件,看看它是如何运作的。忽略关于许可的注释行,顶部和底部会如下所示:
from flask import Flask, render_template, request
import google.auth
from google.cloud import translate
app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')
# . . . [translate() function definition] . . .
if __name__ == '__main__':
import os
app.run(debug=True, threaded=True, host='0.0.0.0',
port=int(os.environ.get('PORT', 8080)))
- 这些导入会引入 Flask 功能、
google.auth
模块和 Cloud Translation API 客户端库。 - 全局变量代表 Flask 应用、Cloud 项目 ID、Translation API 客户端、Translation API 调用的父“位置路径”,以及源语言和目标语言。在本例中,它们分别是英语 (
en
) 和西班牙语 (es
),但您可以随意将这些值更改为 Cloud Translation API 支持的其他语言代码。 - 底部的大型
if
块在本地运行此应用教程中有所用途,它利用 Flask 开发服务器来提供我们的应用。此部分也适用于 Cloud Run 部署教程,以防 Web 服务器未捆绑到容器中。系统会提示您在容器中启用服务器捆绑,但如果您忽略了这一点,应用代码会回退到使用 Flask 开发服务器。(这不是 App Engine 或 Cloud Functions 的问题,因为它们是基于来源的平台,这意味着 Google Cloud 提供并运行默认的 Web 服务器。)
最后,在 main.py
中间是应用的核心,即 translate()
函数:
@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
"""
main handler - show form and possibly previous translation
"""
# Flask Request object passed in for Cloud Functions
# (use gcf_request for GCF but flask.request otherwise)
local_request = gcf_request if gcf_request else request
# reset all variables (GET)
text = translated = None
# if there is data to process (POST)
if local_request.method == 'POST':
text = local_request.form['text']
data = {
'contents': [text],
'parent': PARENT,
'target_language_code': TARGET[0],
}
# handle older call for backwards-compatibility
try:
rsp = TRANSLATE.translate_text(request=data)
except TypeError:
rsp = TRANSLATE.translate_text(**data)
translated = rsp.translations[0].translated_text
# create context & render template
context = {
'orig': {'text': text, 'lc': SOURCE},
'trans': {'text': translated, 'lc': TARGET},
}
return render_template('index.html', **context)
主要函数负责接收用户输入,并调用 Translation API 来执行繁重工作。我们来详细了解一下:
- 使用
local_request
变量检查请求是否来自 Cloud Functions。Cloud Functions 会发送自己的 Flask Request 对象,而所有其他函数(在本地运行或部署到 App Engine 或 Cloud Run)都会直接从 Flask 获取请求对象。 - 重置表单的基本变量。这主要适用于 GET 请求,因为 POST 请求将有数据来替换这些值。
- 如果是 POST 请求,请提取要翻译的文本,并创建一个表示 API 元数据要求的 JSON 结构。然后调用该 API,如果用户使用的是较旧的库,则回退到该 API 的旧版本。
- 无论如何,请将实际结果 (POST) 或无数据 (GET) 格式化为模板上下文并进行渲染。
应用的可视部分位于模板 index.html
文件中。它会显示之前翻译过的所有内容(否则为空),后跟一个用于输入要翻译的内容的表单:
<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>
{% if trans['text'] %}
<h4>Previous translation</h4>
<li><b>Original</b>: {{ orig['text'] }} (<i>{{ orig['lc'][0] }}</i>)</li>
<li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}
<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>
6. 部署服务
如需将翻译服务部署到 (Python 3) Cloud Functions,请运行以下命令:
gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated
输出应如下所示,并提供一些有关后续步骤的提示:
$ gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated Deploying function (may take a while - up to 2 minutes)...⠹ For Cloud Build Stackdriver Logs, visit: https://console.cloud.google.com/logs/viewer?project=PROJECT_ID&advancedFilter=resource.type%3Dbuild%0Aresource.labels.build_id%3D7e32429d-ec36-422c-8a8b-43c4d661a15c%0AlogName%3Dprojects%2FPROJECT_ID%2Flogs%2Fcloudbuild Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: 7e32429d-ec36-422c-8a8b-43c4d661a15 entryPoint: translate httpsTrigger: securityLevel: SECURE_OPTIONAL url: https://REGION-PROJECT_ID.cloudfunctions.net/translate ingressSettings: ALLOW_ALL labels: deployment-tool: cli-gcloud name: projects/PROJECT_ID/locations/REGION/functions/translate runtime: python37 serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-873f8448-838f-4eb2-beda-3e200a1420d/cb1cbdca-34eb-41d0-88d6-c276d5205fb.zip?GoogleAccessId=service-104690130103@gcf-admin-robot.iam.gserviceaccount.com&Expires=1619139674 status: ACTIVE timeout: 60s updateTime: '2021-04-23T00:32:58.065Z' versionId: '3'
现在,您的应用已面向全球发布,您应该能够通过包含项目 ID 的网址访问该应用(如部署输出中所示)。网址应如下所示:https://
REGION
-
PROJECT_ID
.cloudfunctions.net/translate
,具体取决于您选择的区域以及您的 Cloud 项目 ID。
翻译一些内容,看看效果如何!
7. 总结
恭喜!您已了解如何启用 Cloud Translation API、获取必要的凭据,以及如何将简单的 Web 应用部署到 Cloud Functions!如需详细了解此部署,请参阅代码库中的此表格。
清理
借助 Cloud Translation API,您可以每月免费翻译固定数量的字符。App Engine 还有免费配额,Cloud Functions 和 Cloud Run 也是如此。如果超出任一上限,您将需要支付费用。如果您打算继续学习下一个 Codelab,则无需关闭应用。
不过,如果您还不准备学习下一教程,或者担心互联网会发现您刚刚部署的应用,请停用 App Engine 应用、删除 Cloud Functions 或停用 Cloud Run 服务,以免产生费用。当您准备好进入下一个 Codelab 时,可以重新启用该功能。另一方面,如果您不打算继续使用此应用或其他 Codelab,并且想彻底删除所有内容,可以关闭项目。
此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用。Cloud Build 和 Cloud Storage 都有自己的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,然后将其存储在 Cloud Container Registry 或其后继产品 Artifact Registry 中。存储该图片会使用部分配额,将该图片传输到服务时也会使用部分网络出站流量。不过,您所在的地区可能不提供此类免费层级,因此请注意您的存储用量,以尽可能降低潜在费用。
8. 其他资源
在下一部分中,您可以找到其他阅读材料以及推荐的练习,以便巩固您在本教程中学到的知识。
其他研究
现在,您已经有了一些使用 Translation API 的经验,接下来我们再做一些额外的练习,以进一步提升您的技能。如需继续学习,请修改我们的示例应用,以执行以下操作:
- 完成此 Codelab 的所有其他版本,以便在本地运行或部署到 Google Cloud 无服务器计算平台(请参阅代码库自述文件)。
- 使用其他编程语言完成本教程。
- 更改此应用以支持不同的源语言或目标语言。
- 升级此应用,以便将文本翻译成多种语言;更改模板文件,以显示支持的目标语言的下拉菜单。
了解详情
Google App Engine
- App Engine 首页
- App Engine 文档
- Python 3 App Engine 快速入门
- App Engine 的默认服务账号
- Python 2 App Engine(标准)运行时
- Python 3 App Engine(标准)运行时
- Python 2 和 Python 3 App Engine(标准)运行时的区别
- Python 2 到 Python 3 App Engine(标准版)迁移指南
Google Cloud Functions
Google Cloud Run
Google Cloud Buildpacks、Container Registry、Artifact Registry
- Cloud Buildpack 公告
- Cloud Buildpack 代码库
- Cloud Artifact Registry 首页
- Cloud Artifact Registry 文档
- Cloud Container Registry 首页
- Cloud Container Registry 文档
Google Cloud Translation 和 Google ML Kit
- Cloud Translation 首页
- Cloud Translation 文档
- Translation API 价格页面
- 所有 Cloud AI/ML“构建块”API
- Google ML Kit(适用于移动设备的 Cloud AI/ML API 子集)
- Google ML Kit Translation API
其他 Google Cloud 产品/页面
Python 和 Flask
许可
本教程已获得 Creative Commons Attribution 2.0 通用许可,而代码库中的源代码已获得 Apache 2 许可。