Wdróż podstawową wersję Tłumacza Google aplikacja w Pythonie 3 w Cloud Functions

1. Omówienie

Ta seria laboratoriów programistycznych (samodzielnych, praktycznych samouczków) ma pomóc deweloperom zrozumieć różne opcje, z których mogą korzystać podczas wdrażania aplikacji. Z tego laboratorium z kodem dowiesz się, jak używać interfejsu Google Cloud Translation API w Pythonie i uruchamiać go lokalnie lub wdrażać na bezserwerowej platformie obliczeniowej w chmurze (App Engine, Cloud Functions lub Cloud Run). Przykładową aplikację znajdującą się w repozytorium tego samouczka można wdrożyć (co najmniej) na 8 sposobów za pomocą zaledwie drobnych zmian konfiguracji:

  1. Lokalny serwer Flask (Python 2)
  2. Lokalny serwer Flask (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Python 2 w Dockerze)
  7. Cloud Run (Python 3 w Dockerze)
  8. Cloud Run (Python 3 za pomocą pakietów kompilacji Cloud)

Ten warsztat dotyczy wdrażania tej aplikacji na platformy oznaczone pogrubieniem powyżej.

Dowiedz się, jak

Czego potrzebujesz

  • projekt Google Cloud z aktywnym kontem rozliczeniowym Cloud.
  • Flask zainstalowany do uruchamiania lokalnie lub bezserwerowa platforma obliczeniowa w chmurze włączona do wdrożeń w chmurze.
  • podstawowa znajomość Pythona;
  • znajomość podstawowych poleceń systemu operacyjnego;

Ankieta

Jak będziesz korzystać z tego samouczka?

Przeczytaj i wykonaj ćwiczenia Tylko przeczytaj

Jak oceniasz swoje doświadczenie z Pythonem?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Konfiguracja środowiska w samodzielnym tempie

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, którego nie używają interfejsy API Google, i który możesz zaktualizować w dowolnym momencie.
  • Identyfikator projektu musi być niepowtarzalny we wszystkich projektach Google Cloud i jest niezmienny (nie można go zmienić po jego ustawieniu). Konsole Google Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem musisz podać identyfikator projektu (zazwyczaj jest to PROJECT_ID). Jeśli Ci się nie podoba, wygeneruj inny losowy identyfikator lub spróbuj użyć własnego i sprawdź, czy jest dostępny. Następnie po utworzeniu projektu jest „zamrażany”.
  • Istnieje jeszcze trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów i interfejsów API usługi Cloud. Przejście przez ten moduł Codelab nie powinno wiązać się z wielkimi kosztami, jeśli w ogóle z nimi będzie. Aby wyłączyć zasoby i uniknąć opłat po zakończeniu samouczka, wykonaj instrukcje „czyszczenia” podane na końcu ćwiczenia. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

3. Włączanie interfejsu Translation API

Z tej sekcji dowiesz się, jak ogólnie włączyć interfejsy API Google. W przypadku przykładowej aplikacji musisz włączyć interfejs Cloud Translation API i usługę Cloud Functions.

Wprowadzenie

Niezależnie od tego, którego interfejsu Google API chcesz używać w aplikacji, musisz go włączyć. Ten przykład pokazuje 2 sposoby włączania interfejsu Cloud Vision API. Gdy już się nauczysz, jak włączyć jeden interfejs Cloud API, będziesz mieć możliwość włączenia innych interfejsów API, ponieważ proces jest podobny.

Opcja 1. Z Cloud Shell lub interfejsu wiersza poleceń

Chociaż częstszym sposobem jest włączanie interfejsów API w konsoli Cloud, niektórzy deweloperzy wolą wykonywać wszystkie czynności z wiersza poleceń. W tym celu musisz sprawdzić „nazwa usługi” interfejsu API. Wygląda jak adres URL: SERVICE_NAME.googleapis.com. Znajdziesz je w tabeli obsługiwanych usług lub możesz wysłać zapytanie programowe za pomocą interfejsu Google Discovery API.

Mając te informacje, możesz włączyć interfejs API za pomocą Cloud Shell (lub lokalnego środowiska programistycznego z zainstalowanym narzędziem wiersza poleceń gcloud). Aby to zrobić, wykonaj te czynności:

gcloud services enable SERVICE_NAME.googleapis.com

Na przykład to polecenie włącza interfejs Cloud Vision API:

gcloud services enable vision.googleapis.com

To polecenie włącza App Engine:

gcloud services enable appengine.googleapis.com

Możesz też włączyć kilka interfejsów API za pomocą jednego żądania. Na przykład to polecenie włącza Cloud Run, Cloud Artifact Registry i interfejs Cloud Translation API:

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

Opcja 2. Z poziomu Cloud Console

Możesz też włączyć Vision API w Menedżerze interfejsów API. W konsoli Cloud otwórz Menedżera interfejsów API i wybierz Biblioteka.

fb0f1d315f122d4a.png

Jeśli chcesz włączyć interfejs Cloud Vision API, zacznij wpisywać „vision” na pasku wyszukiwania. Pojawi się wszystko, co pasuje do tego, co zostało do tej pory wpisane:

2275786a24f8f204.png

Wybierz interfejs API, który chcesz włączyć, i kliknij Włącz:

2556f923b628e31.png

Koszt

Chociaż wiele interfejsów API Google można używać bez opłat, nie można tego powiedzieć o produktach i interfejsach API Google Cloud. Podczas włączania interfejsów API Cloud możesz zostać poproszony o podanie aktywnego konta rozliczeniowego. Pamiętaj jednak, że niektóre usługi Google Cloud mają poziom „Zawsze bezpłatnie” (dobowy/miesięczny), który musisz przekroczyć, aby naliczały się opłaty. W przeciwnym razie Twoja karta kredytowa (lub wskazany instrument rozliczeniowy) nie zostanie obciążona.

Przed włączeniem interfejsu API użytkownicy powinni zapoznać się z informacjami o cenach, zwracając szczególną uwagę na to, czy interfejs ma bezpłatny poziom dostępu i jakie są jego warunki. Jeśli włączasz interfejs Cloud Vision API, powinieneś sprawdzić informacje o cenach. Cloud Vision ma bezpłatny limit, a dopóki nie przekroczysz go łącznie (w danym miesiącu), nie powinieneś ponosić żadnych opłat.

Ceny i poziomy bezpłatnego korzystania z interfejsów API Google różnią się w zależności od interfejsu. Przykłady:

Różne usługi Google są rozliczane na różne sposoby, dlatego zapoznaj się z dokumentacją interfejsu API, aby uzyskać te informacje.

Podsumowanie

Teraz, gdy już wiesz, jak ogólnie włączyć interfejsy API Google, otwórz Menedżera interfejsów API i włącz interfejsy Cloud Translation API oraz Cloud Functions (jeśli jeszcze tego nie zrobiono). Ten drugi, ponieważ będzie go używać nasza aplikacja, a pierwszy, ponieważ wdrażasz funkcję Cloud Functions. Jeśli wolisz to zrobić z wiersza poleceń, uruchom to polecenie:

gcloud services enable cloudfunctions.googleapis.com translate.googleapis.com

Chociaż limit miesięczny nie jest wymieniony na ogólnej stronie podsumowania poziomu „Zawsze bezpłatnie”, na stronie z cenami interfejsu API Tłumacz podano, że wszyscy użytkownicy otrzymują co miesiąc stałą liczbę przetłumaczonych znaków. Jeśli nie przekroczysz tego progu, nie poniesiesz żadnych opłat za korzystanie z interfejsu API. Jeśli są jakieś inne opłaty związane z Google Cloud, zostaną one omówione na końcu w sekcji „Usuwanie”.

4. Pobieranie przykładowego kodu aplikacji

Skopiuj kod z repozytorium lokalnie lub w Cloud Shell (za pomocą polecenia git clone) albo pobierz plik ZIP, klikając zielony przycisk Kod, jak pokazano na poniższym zrzucie ekranu:

5cd6110c4414cf65.png

Gdy już wszystko będzie gotowe, utwórz pełną kopię folderu, aby wykonać ten samouczek, ponieważ będzie on prawdopodobnie wymagał usunięcia lub zmiany plików. Jeśli chcesz przeprowadzić inną implementację, możesz zacząć od kopiowania oryginału, aby nie trzeba było go ponownie klonować ani pobierać.

5. Prezentacja przykładowej aplikacji

Przykładowa aplikacja to prosta odmiana Tłumacza Google, która prosi użytkowników o wpisanie tekstu w języku angielskim, a następnie wyświetla jego tłumaczenie na język hiszpański. Otwórz teraz plik main.py, aby zobaczyć, jak to działa. Pomijając skomentowane wiersze dotyczące licencjonowania, na górze i na dole wygląda to tak:

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. Importy umożliwiają korzystanie z funkcji Flask, modułu google.auth i biblioteki klienta Cloud Translation API.
  2. Zmienne globalne reprezentują aplikację Flask, identyfikator projektu Cloud, klienta Translation API, nadrzędną „ścieżkę lokalizacji” dla wywołań Translation API oraz język źródłowy i docelowy. W tym przypadku są to język angielski (en) i hiszpański (es), ale możesz zmienić te wartości na inne kody języków obsługiwane przez Cloud Translation API.
  3. Duży blok if na dole jest używany w samouctniku do uruchamiania tej aplikacji lokalnie – korzysta z serwera deweloperskiego Flask do obsługi aplikacji. Ta sekcja jest też dostępna w samouctnikach dotyczących wdrażania Cloud Run na wypadek, gdyby serwer WWW nie był spakowany w kontenerze. Pojawi się prośba o włączenie tworzenia pakietu serwera w kontenerze, ale jeśli ją przeoczysz, kod aplikacji będzie używać serwera deweloperskiego Flask. (Nie jest to problem z App Engine ani Cloud Functions, ponieważ są to platformy oparte na źródłach, co oznacza, że Google Cloud udostępnia i uruchamia domyślny serwer internetowy).

W środku pliku main.py znajduje się serce aplikacji, czyli funkcja 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)

Funkcja główna pobiera dane wejściowe od użytkownika i wywołuje interfejs Translation API, aby wykonać ciężką pracę. Przeanalizujmy to:

  1. Sprawdź, czy żądania pochodzą z Cloud Functions, korzystając ze zmiennej local_request. Cloud Functions wysyła własny obiekt żądania Flask, podczas gdy wszystkie inne (uruchamiane lokalnie lub wdrażane w App Engine lub Cloud Run) otrzymają obiekt żądania bezpośrednio z Flask.
  2. Zresetuj podstawowe zmienne formularza. Dotyczy to przede wszystkim żądań GET, ponieważ żądania POST będą zawierać dane, które je zastąpią.
  3. Jeśli jest to żądanie POST, pobierz tekst do przetłumaczenia i utwórz strukturę JSON reprezentującą wymagania dotyczące metadanych interfejsu API. Następnie wywołaj interfejs API, korzystając w razie potrzeby z poprzedniej wersji interfejsu API, jeśli użytkownik używa starszej biblioteki.
  4. W każdym razie sformatuj rzeczywiste wyniki (POST) lub brak danych (GET) w kontekście szablonu i wyświetl.

Część wizualna aplikacji znajduje się w pliku szablonu index.html. Pokazuje wcześniej przetłumaczone wyniki (w przeciwnym razie puste pole) oraz formularz z prośbą o coś do przetłumaczenia:

<!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. Wdrażanie usługi

Aby wdrożyć usługę tłumaczenia do Cloud Functions (Python 3), uruchom to polecenie:

gcloud functions deploy translate --runtime python37 --trigger-http --allow-unauthenticated

Dane wyjściowe powinny wyglądać tak i zawierać instrukcje dotyczące dalszych kroków:

$ 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'

Teraz, gdy Twoja aplikacja jest dostępna na całym świecie, powinna być dostępna pod adresem URL zawierającym identyfikator projektu, który widać w wyniku wdrożenia. Adres URL powinien wyglądać tak: https://REGION-PROJECT_ID.cloudfunctions.net/translate. Zmienia się on w zależności od wybranego regionu i identyfikatora projektu Cloud.

518f1c3165f2096d.png

Przetłumacz coś, aby zobaczyć, jak to działa.

539b52bd2537788.png

7. Podsumowanie

Gratulacje! Poznaliśmy sposób włączania interfejsu Cloud Translation API, uzyskiwania niezbędnych danych logowania i wdrażania prostej aplikacji internetowej do Cloud Functions. Więcej informacji o tym wdrożeniu znajdziesz w tabeli w repozytorium.

Czyszczenie danych

Interfejs Cloud Translation API umożliwia bezpłatne przetłumaczenie stałej liczby znaków miesięcznie. App Engine ma też bezpłatny limit, co dotyczy również Cloud Functions i Cloud Run. Jeśli przekroczysz którykolwiek z tych limitów, zostanie naliczona opłata. Jeśli chcesz przejść do następnego ćwiczenia, nie musisz zamykać aplikacji.

Jeśli jednak nie chcesz jeszcze przejść do następnego samouczka lub obawiasz się, że aplikacja, którą właśnie wdrożyłeś/wdrożyłaś, zostanie odkryta w internecie, wyłącz aplikację App Engine, usuń funkcję Cloud Functions lub wyłącz usługę Cloud Run, aby uniknąć opłat. Gdy będziesz gotowy/gotowa przejść do kolejnego Codelab, możesz ponownie włączyć ten tryb. Jeśli z drugiej strony nie chcesz kontynuować pracy nad tą aplikacją ani innymi projektami w Codelab i chcesz wszystko całkowicie usunąć, możesz zamknąć projekt.

Wdrażanie na bezserwerowej platformie obliczeniowej Google Cloud wiąże się też z niewielkimi kosztami kompilacji i przechowywania. Cloud Build ma własną bezpłatną pulę, podobnie jak Cloud Storage. Aby zwiększyć przejrzystość, usługa Cloud Build kompiluje obraz aplikacji, który jest następnie przechowywany w Cloud Container Registry lub Artifact Registry, która jest następcą tej pierwszej. Przechowywanie tego obrazu zużywa część tej puli, podobnie jak przesyłanie sieciowe podczas przesyłania obrazu do usługi. Możesz jednak mieszkać w regionie, w którym nie ma bezpłatnego poziomu, więc aby zminimalizować potencjalne koszty, zwróć uwagę na wykorzystanie miejsca na dane.

8. Dodatkowe materiały

W kolejnych sekcjach znajdziesz dodatkowe materiały do czytania oraz ćwiczenia, które pomogą Ci poszerzyć wiedzę zdobytą w trakcie samouczka.

Dodatkowe badania

Masz już pewne doświadczenie w korzystaniu z interfejsu Translation API, więc wykonaj kilka dodatkowych ćwiczeń, aby doskonalić swoje umiejętności. Aby kontynuować naukę, zmodyfikuj naszą przykładową aplikację, aby wykonać te czynności:

  1. Wykonaj wszystkie inne wersje tego laboratorium kodu, aby uruchomić je lokalnie lub wdrożyć na bezserwerowych platformach obliczeniowych Google Cloud (patrz README repozytorium).
  2. Przejdź przez ten samouczek, używając innego języka programowania.
  3. Zmień tę aplikację, aby obsługiwała inne języki źródłowe lub docelowe.
  4. Zaktualizuj tę aplikację, aby umożliwić tłumaczenie tekstu na więcej niż 1 język. Zmień plik szablonu, aby wyświetlić menu obsługiwanych języków docelowych.

Więcej informacji

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation i Google ML Kit

Inne usługi/strony Google Cloud

Python i Flask

Licencja

Ten samouczek jest objęty licencją Creative Commons Attribution 2.0 Generic License, a kod źródłowy w repozytorium jest objęty licencją Apache 2.