Gunakan "Google Terjemahan" dasar aplikasi di Python 2 App Engine

1. Ringkasan

Rangkaian codelab ini (tutorial praktik mandiri) bertujuan untuk membantu developer memahami berbagai opsi yang mereka miliki saat men-deploy aplikasi. Dalam codelab ini, Anda akan mempelajari cara menggunakan Google Cloud Translation API dengan Python dan menjalankannya secara lokal atau men-deploy ke platform komputasi serverless Cloud (App Engine, Cloud Functions, atau Cloud Run). Aplikasi contoh yang ditemukan di repo tutorial ini dapat di-deploy (setidaknya) dengan delapan cara berbeda hanya dengan perubahan konfigurasi kecil:

  1. Server Flask lokal (Python 2)
  2. Server Flask lokal (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Python 2 melalui Docker)
  7. Cloud Run (Python 3 melalui Docker)
  8. Cloud Run (Python 3 melalui Cloud Buildpacks)

Codelab ini berfokus pada deployment aplikasi ini ke platform yang dicetak tebal di atas.

Anda akan mempelajari cara

Yang Anda butuhkan

  • Project Google Cloud dengan akun Penagihan Cloud yang aktif
  • Flask yang diinstal untuk dijalankan secara lokal, atau platform komputasi serverless Cloud yang diaktifkan untuk deployment berbasis cloud
  • Keterampilan Python dasar
  • Pengetahuan perintah sistem operasi dasar yang berfungsi

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Membacanya dan menyelesaikan latihan Hanya membacanya

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

3. Mengaktifkan Translation API

Untuk aplikasi contoh kami, Anda akan mengaktifkan Cloud Translation API dan layanan App Engine menggunakan petunjuk serupa yang diberikan di bawah.

Mengaktifkan Cloud API

Pengantar

Apa pun Google API yang ingin Anda gunakan di aplikasi, API tersebut harus diaktifkan. Contoh berikut menunjukkan dua cara untuk mengaktifkan Cloud Vision API. Setelah mempelajari cara mengaktifkan satu Cloud API, Anda dapat mengaktifkan API lainnya karena prosesnya serupa.

Opsi 1: Dari Cloud Shell atau antarmuka command line Anda

Meskipun mengaktifkan API dari Cloud Console lebih umum, beberapa developer lebih suka melakukan semuanya dari command line. Untuk melakukannya, Anda perlu mencari "nama layanan" API. URL ini terlihat seperti URL: SERVICE_NAME.googleapis.com. Anda dapat menemukannya di Diagram produk yang didukung, atau Anda dapat membuat kueri secara terprogram dengan Google Discovery API.

Dengan informasi ini, menggunakan Cloud Shell (atau lingkungan pengembangan lokal dengan alat command line gcloud yang diinstal), Anda dapat mengaktifkan API, sebagai berikut:

gcloud services enable SERVICE_NAME.googleapis.com

Misalnya, perintah ini mengaktifkan Cloud Vision API:

gcloud services enable vision.googleapis.com

Perintah ini mengaktifkan App Engine:

gcloud services enable appengine.googleapis.com

Anda juga dapat mengaktifkan beberapa API dengan satu permintaan. Misalnya, command line ini mengaktifkan Cloud Run, Cloud Artifact Registry, dan Cloud Translation API:

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

Opsi 2: Dari Cloud Console

Anda juga dapat mengaktifkan Vision API di Pengelola API. Dari Cloud Console, buka Pengelola API, lalu pilih Library.

fb0f1d315f122d4a.png

Jika Anda ingin mengaktifkan Cloud Vision API, mulai masukkan "vision" di kotak penelusuran, dan semua yang cocok dengan yang telah Anda masukkan sejauh ini akan muncul:

2275786a24f8f204.png

Pilih API yang ingin Anda aktifkan, lalu klik Aktifkan:

2556f923b628e31.png

Biaya

Meskipun banyak Google API yang dapat digunakan tanpa biaya, penggunaan produk & API Google Cloud tidak gratis. Saat mengaktifkan Cloud API, Anda mungkin diminta untuk memberikan akun penagihan yang aktif. Namun, penting untuk diperhatikan bahwa beberapa produk Google Cloud memiliki paket "Selalu Gratis" (harian/bulanan), yang harus Anda lampaui agar muncul tagihan. Jika tidak, kartu kredit Anda (atau instrumen penagihan yang ditentukan) tidak akan ditagih.

Pengguna harus merujuk pada informasi harga untuk API apa pun sebelum mengaktifkannya, terutama dengan memperhatikan apakah API tersebut memiliki paket gratis, dan jika ya, apa paketnya. Jika Anda mengaktifkan Cloud Vision API, Anda akan memeriksa halaman informasi harganya. Cloud Vision memiliki kuota gratis, dan selama Anda tidak melebihi batas agregat (dalam setiap bulan), Anda tidak akan dikenai biaya apa pun.

Harga dan paket gratis bervariasi di antara Google API. Contoh:

Produk Google yang berbeda ditagih secara berbeda, jadi pastikan untuk merujuk dokumentasi API Anda untuk informasi tersebut.

Ringkasan

Setelah Anda mengetahui cara mengaktifkan Google API secara umum, buka API Manager dan aktifkan Cloud Translation API dan layanan App Engine (jika Anda belum melakukannya), yang pertama karena aplikasi kita akan menggunakannya, dan yang kedua karena Anda men-deploy aplikasi App Engine. Jika Anda lebih suka melakukannya dari command line, jalankan perintah ini:

gcloud services enable appengine.googleapis.com translate.googleapis.com

Meskipun kuota bulanannya tidak tercantum di halaman ringkasan tingkat "Selalu Gratis" secara keseluruhan, halaman harga Translation API menyatakan bahwa semua pengguna mendapatkan jumlah karakter terjemahan tetap setiap bulan. Anda tidak akan dikenai biaya apa pun dari API jika tetap berada di bawah nilai minimum tersebut. Jika ada tagihan lain terkait Google Cloud, tagihan tersebut akan dibahas di bagian "Pembersihan" di akhir.

4. Mendapatkan kode aplikasi contoh

Clone kode di repo secara lokal atau di Cloud Shell (menggunakan perintah git clone), atau download file ZIP dari tombol Code hijau seperti yang ditunjukkan pada screenshot berikut:

5cd6110c4414cf65.png

Setelah Anda memiliki semuanya, buat salinan lengkap folder untuk melakukan tutorial khusus ini, karena tutorial ini mungkin akan melibatkan penghapusan atau perubahan file. Jika ingin melakukan deployment yang berbeda, Anda dapat memulai dari awal dengan menyalin yang asli sehingga tidak perlu meng-clone atau mendownloadnya lagi.

5. Tur aplikasi contoh

Aplikasi contoh adalah turunan Google Terjemahan sederhana yang meminta pengguna memasukkan teks dalam bahasa Inggris dan menerima terjemahan yang setara dari teks tersebut dalam bahasa Spanyol. Sekarang buka file main.py agar kita dapat melihat cara kerjanya. Jika baris yang dikomentari tentang pemberian lisensi dihilangkan, tampilannya akan terlihat seperti ini di bagian atas dan bawah:

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)))
  1. Impor ini akan menghadirkan fungsi Flask, modul google.auth, dan library klien Cloud Translation API.
  2. Variabel global mewakili aplikasi Flask, project ID Cloud, klien Translation API, "jalur lokasi" induk untuk panggilan Translation API, serta bahasa sumber dan target. Dalam hal ini, bahasanya adalah Inggris (en) dan Spanyol (es), tetapi Anda dapat mengubah nilai ini ke kode bahasa lain yang didukung oleh Cloud Translation API.
  3. Blok if besar di bagian bawah digunakan dalam tutorial untuk menjalankan aplikasi ini secara lokal—blok ini menggunakan server pengembangan Flask untuk menayangkan aplikasi kita. Bagian ini juga ada di sini untuk tutorial deployment Cloud Run jika server web tidak dipaketkan ke dalam penampung. Anda diminta untuk mengaktifkan penggabungan server dalam penampung, tetapi jika Anda mengabaikannya, kode aplikasi akan kembali menggunakan server pengembangan Flask. (Ini bukan masalah dengan App Engine atau Cloud Functions karena keduanya adalah platform berbasis sumber, yang berarti Google Cloud menyediakan dan menjalankan server web default.)

Terakhir, di tengah main.py adalah inti aplikasi, fungsi 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)

Fungsi utama melakukan pekerjaan mengambil input pengguna, dan memanggil Translation API untuk melakukan pekerjaan berat. Mari kita bahas satu per satu:

  1. Periksa apakah permintaan berasal dari Cloud Functions menggunakan variabel local_request. Cloud Functions mengirimkan objek Permintaan Flask-nya sendiri, sedangkan semua yang lain (berjalan secara lokal atau di-deploy ke App Engine atau Cloud Run) akan mendapatkan objek permintaan langsung dari Flask.
  2. Reset variabel dasar untuk formulir. Hal ini terutama untuk permintaan GET karena permintaan POST akan memiliki data yang menggantikannya.
  3. Jika permintaannya adalah POST, ambil teks yang akan diterjemahkan, dan buat struktur JSON yang mewakili persyaratan metadata API. Kemudian, panggil API, yang akan kembali ke versi API sebelumnya jika pengguna menggunakan library yang lebih lama.
  4. Apa pun hasilnya, format hasil sebenarnya (POST) atau tidak ada data (GET) ke dalam konteks template dan render.

Bagian visual aplikasi ada dalam file index.html template. Halaman ini menampilkan hasil terjemahan sebelumnya (kosong jika tidak ada) diikuti dengan formulir yang meminta sesuatu untuk diterjemahkan:

<!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. Menginstal paket/dependensi lokal (ke dalam lib)

Seperti yang disebutkan sebelumnya, aplikasi contoh menggunakan framework web mikro Flask dan library klien Google Cloud Translation API untuk Python. Instal dan update pip beserta sepasang paket ini dengan perintah pip (atau pip3) ini:

pip install -t lib -r requirements.txt

Setelah menjalankan komentar di atas, Anda akan melihat output penginstalan yang mungkin terlihat seperti ini:

$ 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. Men-deploy layanan

Untuk men-deploy layanan terjemahan ke App Engine Python 2, jalankan perintah ini:

gcloud app deploy

Output akan terlihat seperti berikut, dan memberikan beberapa perintah untuk langkah berikutnya:

$ 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

Setelah aplikasi tersedia secara global di seluruh dunia, Anda akan dapat mengaksesnya di URL (yang berisi project ID) yang diberikan dalam output deployment:

da28f951c33a2c3d.png

Terjemahkan sesuatu untuk melihat cara kerjanya.

d911984d15dd5ef9.png

8. Kesimpulan

Selamat! Anda telah mempelajari cara mengaktifkan Cloud Translation API, mendapatkan kredensial yang diperlukan, dan men-deploy aplikasi web sederhana ke App Engine Python 2. Anda dapat mempelajari lebih lanjut deployment ini dari tabel ini di repo.

Pembersihan

Cloud Translation API memungkinkan Anda melakukan jumlah karakter terjemahan tetap per bulan secara gratis. App Engine juga memiliki kuota gratis, dan hal yang sama berlaku untuk Cloud Functions dan Cloud Run. Anda akan dikenai biaya jika salah satunya terlampaui. Jika berencana melanjutkan ke codelab berikutnya, Anda tidak perlu menonaktifkan aplikasi.

Namun, jika Anda belum siap melanjutkan ke tutorial berikutnya atau khawatir internet akan menemukan aplikasi yang baru saja Anda deploy, nonaktifkan aplikasi App Engine, hapus Cloud Function, atau nonaktifkan layanan Cloud Run untuk menghindari tagihan. Jika sudah siap untuk beralih ke codelab berikutnya, Anda dapat mengaktifkannya kembali. Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab lainnya dan ingin menghapus semuanya, Anda dapat mematikan project.

Selain itu, men-deploy ke platform komputasi serverless Google Cloud akan menimbulkan biaya build dan penyimpanan kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Untuk transparansi yang lebih besar, Cloud Build mem-build image aplikasi Anda, yang kemudian disimpan di Cloud Container Registry atau Artifact Registry, penerusnya. Penyimpanan gambar tersebut akan menggunakan sebagian kuota tersebut, begitu juga dengan traffic keluar jaringan saat mentransfer gambar tersebut ke layanan. Namun, Anda mungkin tinggal di wilayah yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya.

9. Referensi lainnya

Di bagian berikut, Anda dapat menemukan materi bacaan tambahan serta latihan yang direkomendasikan untuk menambah pengetahuan yang diperoleh dari menyelesaikan tutorial ini.

Studi tambahan

Setelah Anda memiliki beberapa pengalaman dengan Translation API, mari kita lakukan beberapa latihan tambahan untuk mengembangkan keterampilan Anda lebih lanjut. Untuk melanjutkan jalur pembelajaran Anda, ubah aplikasi contoh kami untuk melakukan hal berikut:

  1. Selesaikan semua edisi lain dari codelab ini untuk dijalankan secara lokal atau di-deploy ke platform komputasi serverless Google Cloud (lihat README repo).
  2. Selesaikan tutorial ini menggunakan bahasa pemrograman lain.
  3. Ubah aplikasi ini untuk mendukung bahasa sumber atau target yang berbeda.
  4. Mengupgrade aplikasi ini agar dapat menerjemahkan teks ke dalam lebih dari satu bahasa; mengubah file template agar memiliki pulldown bahasa target yang didukung.

Pelajari lebih lanjut

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation dan Google ML Kit

Produk/halaman Google Cloud lainnya

Python dan Flask

Lisensi

Tutorial ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0, sedangkan kode sumber di repo dilisensikan berdasarkan Apache 2.