1. 總覽
這一系列的程式碼研究室 (自學式實作教學課程) 旨在協助開發人員瞭解部署應用程式時的各種選項。在本程式碼研究室中,您將瞭解如何透過 Python 使用 Google Cloud Translation API,並在本機執行或部署至 Cloud 無伺服器運算平台 (App Engine、Cloud Functions 或 Cloud Run)。您可以在本教學課程的存放區中找到範例應用程式,只要稍做設定變更,就能以 (至少) 八種不同方式部署:
- 本機 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 Buildpacks 進行 Python 3)
本程式碼研究室著重於將這個應用程式部署至上述粗體平台。
課程內容
- 使用 Google Cloud API,特別是 Cloud Translation API (進階/v3)
- 在本機執行基本網頁應用程式,或部署至 Cloud 無伺服器運算平台
軟硬體需求
- Google Cloud 專案,並啟用 Cloud Billing 帳戶
- 已安裝 Flask (用於在本機執行),或已啟用雲端無伺服器運算平台 (用於雲端部署)
- Python 基礎技能
- 熟悉基本作業系統指令
問卷調查
您會如何使用本教學課程?
你對 Python 的使用體驗如何?
您對使用 Google Cloud 服務的體驗滿意嗎?
2. 設定和需求條件
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」該值。 - 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
3. 啟用 Translation API
在範例應用程式中,您會改為啟用 Cloud Translation API 和 App Engine 服務,請按照下方的類似操作說明進行。
啟用 Cloud API
簡介
無論您要在應用程式中使用哪個 Google 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 前,使用者應先參考定價資訊,特別注意是否有免費層級,以及免費層級的內容。如果您要啟用 Cloud Vision API,請查看定價資訊頁面。Cloud Vision 確實提供免費配額,只要每月總用量不超過上限,就不會產生任何費用。
Google API 的定價和免費層級各不相同。範例:
- Google Cloud/GCP:每項產品的計費方式不同,一般是依據 vCPU 週期、儲存空間用量、記憶體用量或用量計費;詳情請參閱上文的免費層級資訊。
- Google 地圖:提供一系列 API,使用者每月可獲得 $200 美元的免費額度。
- Google Workspace (舊稱 G Suite) API:只要支付 Workspace 月費,即可免費使用 (設有上限),因此使用 Gmail、Google 雲端硬碟、日曆、文件、試算表和簡報 API 時,不會直接產生費用。
不同 Google 產品的計費方式不同,因此請務必參閱 API 的說明文件,瞭解相關資訊。
摘要
現在您已瞭解如何啟用 Google API,請前往 API 管理工具,並啟用 Cloud Translation API 和 App Engine 服務 (如果尚未啟用)。前者是因為我們的應用程式會使用這項服務,後者則是因為您要部署 App Engine 應用程式。如要透過指令列啟用,請改為發出下列指令:
gcloud services enable appengine.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 部署作業教學課程。系統會要求您在容器中啟用伺服器套裝組合,但如果您忽略這項要求,應用程式程式碼就會改用 Flask 開發伺服器。(這不是 App Engine 或 Cloud Functions 的問題,因為這些平台是以來源為基礎,也就是說,Google Cloud 會提供並執行預設的網頁伺服器)。
最後,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. 安裝本機套件/依附元件 (到 lib)
如先前所述,範例應用程式使用 Flask 微型網路架構,以及 Python 適用的 Google Cloud Translation API 用戶端程式庫。使用下列 pip (或 pip3) 指令,安裝及更新 pip 和這兩個套件:
pip install -t lib -r requirements.txt
執行上述註解後,您會看到安裝輸出內容,可能如下所示:
$ pip install -t lib -r requirements.txt
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Collecting flask>=1.1.2
Using cached Flask-1.1.4-py2.py3-none-any.whl (94 kB)
Collecting google-cloud-translate>=2.0.1
Using cached google_cloud_translate-2.0.2-py2.py3-none-any.whl (91 kB)
Collecting click<8.0,>=5.1
Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Jinja2<3.0,>=2.10.1
Using cached Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
Collecting Werkzeug<2.0,>=0.15
Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting itsdangerous<2.0,>=0.24
Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.15.0
Downloading google_api_core-1.29.0-py2.py3-none-any.whl (93 kB)
|████████████████████████████████| 93 kB 2.1 MB/s
Collecting google-cloud-core<2.0dev,>=1.1.0
Using cached google_cloud_core-1.6.0-py2.py3-none-any.whl (28 kB)
Collecting MarkupSafe>=0.23
Using cached MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl (17 kB)
Collecting protobuf>=3.12.0
Downloading protobuf-3.17.2-cp27-cp27m-macosx_10_9_x86_64.whl (958 kB)
|████████████████████████████████| 958 kB 21.6 MB/s
Collecting futures>=3.2.0; python_version < "3.2"
Using cached futures-3.3.0-py2-none-any.whl (16 kB)
Collecting six>=1.13.0
Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting packaging>=14.3
Using cached packaging-20.9-py2.py3-none-any.whl (40 kB)
Collecting googleapis-common-protos<2.0dev,>=1.6.0
Using cached googleapis_common_protos-1.52.0-py2.py3-none-any.whl (100 kB)
Collecting requests<3.0.0dev,>=2.18.0
Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting google-auth<2.0dev,>=1.25.0
Using cached google_auth-1.30.1-py2.py3-none-any.whl (146 kB)
Collecting pytz
Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting setuptools>=40.3.0
Using cached setuptools-44.1.1-py2.py3-none-any.whl (583 kB)
Collecting grpcio<2.0dev,>=1.29.0; extra == "grpc"
Using cached grpcio-1.38.0-cp27-cp27m-macosx_10_10_x86_64.whl (3.8 MB)
Collecting pyparsing>=2.0.2
Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting chardet<5,>=3.0.2
Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting urllib3<1.27,>=1.21.1
Using cached urllib3-1.26.5-py2.py3-none-any.whl (138 kB)
Collecting idna<3,>=2.5
Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
Downloading certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
|████████████████████████████████| 145 kB 61.1 MB/s
Collecting pyasn1-modules>=0.2.1
Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting rsa<4.6; python_version < "3.6"
Using cached rsa-4.5-py2.py3-none-any.whl (36 kB)
Collecting cachetools<5.0,>=2.0.0
Using cached cachetools-3.1.1-py2.py3-none-any.whl (11 kB)
Collecting enum34>=1.0.4; python_version < "3.4"
Using cached enum34-1.1.10-py2-none-any.whl (11 kB)
Collecting pyasn1<0.5.0,>=0.4.6
Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask, six, protobuf, futures, pyparsing, packaging, googleapis-common-protos, chardet, urllib3, idna, certifi, requests, pyasn1, pyasn1-modules, rsa, cachetools, setuptools, google-auth, pytz, enum34, grpcio, google-api-core, google-cloud-core, google-cloud-translate
ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
matplotlib 1.3.1 requires nose, which is not installed.
matplotlib 1.3.1 requires tornado, which is not installed.
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 cachetools-3.1.1 certifi-2021.5.30 chardet-4.0.0 click-7.1.2 enum34-1.1.10 flask-1.1.4 futures-3.3.0 google-api-core-1.29.0 google-auth-1.30.1 google-cloud-core-1.6.0 google-cloud-translate-2.0.2 googleapis-common-protos-1.52.0 grpcio-1.38.0 idna-2.10 itsdangerous-1.1.0 packaging-20.9 protobuf-3.17.2 pyasn1-0.4.8 pyasn1-modules-0.2.8 pyparsing-2.4.7 pytz-2021.1 requests-2.25.1 rsa-4.5 setuptools-44.1.1 six-1.16.0 urllib3-1.26.5
7. 部署服務
如要將翻譯服務部署至 Python 2 App Engine,請執行下列指令:
gcloud app deploy
輸出內容應如下所示,並提供後續步驟的一些提示:
$ gcloud app deploy Services to deploy: descriptor: [/private/tmp/nebulous-serverless-python/app.yaml] source: [/private/tmp/nebulous-serverless-python] target project: [PROJECT_ID] target service: [default] target version: [20210422t161025] target url: [https://PROJECT_ID.appspot.com] Do you want to continue (Y/n)? Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 1290 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://PROJECT_ID.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
現在您的應用程式已在全球推出,您應該可以透過部署輸出內容中提供的網址 (內含專案 ID) 存取應用程式:

翻譯內容,看看這項功能如何運作!

8. 結語
恭喜!您已學會如何啟用 Cloud Translation API、取得必要憑證,以及將簡單的網頁應用程式部署至 Python 2 App Engine!如要進一步瞭解這項部署作業,請參閱存放區中的這個表格。
清除所用資源
Cloud Translation API 每月提供固定額度的免費翻譯字元。App Engine 也提供免費配額,Cloud Functions 和 Cloud Run 也是如此。如果超過任一限制,就會產生費用。如果您打算繼續下一個程式碼研究室,則不必關閉應用程式。
不過,如果您還沒準備好進行下一個教學課程,或是擔心網際網路會發現您剛部署的應用程式,請停用 App Engine 應用程式、刪除 Cloud Function 或停用 Cloud Run 服務,以免產生費用。準備好進行下一個程式碼研究室時,可以重新啟用這項功能。另一方面,如果您不打算繼續使用這個應用程式或其他程式碼研究室,並想徹底刪除所有內容,可以關閉專案。
此外,部署至 Google Cloud 無伺服器運算平台會產生少許建構和儲存空間費用。Cloud Build 和 Cloud Storage 都有各自的免費配額。為提高透明度,Cloud Build 會建構應用程式映像檔,然後儲存在 Cloud Container Registry 或後繼服務 Artifact Registry 中。儲存該圖片會耗用部分配額,將圖片傳輸至服務時也會耗用網路輸出量。不過,你所在的區域可能沒有這類免付費層級,因此請留意儲存空間用量,盡量減少潛在費用。
9. 其他資源
在接下來的章節中,您可以找到額外的閱讀資料和建議練習,進一步擴充完成本教學課程所學到的知識。
其他研究
現在您已具備 Translation API 的使用經驗,接下來請完成一些額外練習,進一步提升技能。如要繼續學習,請修改範例應用程式,完成下列操作:
- 完成本程式碼研究室的所有其他版本,即可在本機執行或部署至 Google Cloud 無伺服器運算平台 (請參閱 repo README)。
- 使用其他程式設計語言完成本教學課程。
- 變更這個應用程式,支援不同的來源或目標語言。
- 升級這個應用程式,即可將文字翻譯成多種語言;變更範本檔案,加入支援的目標語言下拉式選單。
瞭解詳情
Google App Engine
- App Engine 首頁
- App Engine 說明文件
- Python 3 App Engine 快速入門導覽課程
- App Engine 預設服務帳戶
- Python 2 App Engine (標準) 執行階段
- Python 3 App Engine (標準) 執行階段
- Python 2 與 3 App Engine (標準) 執行階段的差異
- Python 2 到 3 App Engine (標準) 遷移指南
Google Cloud Functions
Google Cloud Run
Google Cloud Buildpacks、Container Registry、Artifact Registry
- Cloud Buildpacks 公告
- Cloud Buildpacks 存放區
- 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
授權
本教學課程採用創用 CC 姓名標示 2.0 通用授權,而存放區中的原始碼則採用 Apache 2 授權。