Разверните базовую версию "Google Translate" приложение на платформе приложений Python 2

1. Обзор

Эта серия курсов по кодированию (практические руководства для самостоятельного обучения) призвана помочь разработчикам понять различные варианты, которые у них есть при развертывании своих приложений. В этой лаборатории кода вы узнаете, как использовать Google Cloud Translation API с Python и запускать его локально или развертывать на облачной бессерверной вычислительной платформе (App Engine, Cloud Functions или Cloud Run). Пример приложения, найденный в репозитории этого руководства, можно развернуть (как минимум) восемью различными способами с небольшими изменениями конфигурации:

  1. Локальный сервер Flask (Python 2)
  2. Локальный сервер Flask (Python 3)
  3. Механизм приложений (Python 2)
  4. Механизм приложений (Python 3)
  5. Облачные функции (Python 3)
  6. Cloud Run (Python 2 через Docker)
  7. Cloud Run (Python 3 через Docker)
  8. Cloud Run (Python 3 через пакеты Cloud Buildpacks)

Эта лаборатория кода посвящена развертыванию этого приложения на платформах, выделенных жирным шрифтом выше.

Вы узнаете, как

Что вам понадобится

  • Проект Google Cloud с активной учетной записью Cloud Billing.
  • Flask установлен для локальной работы или облачная платформа безсерверных вычислений, поддерживающая облачные развертывания.
  • Базовые навыки Python
  • Знание основных команд операционной системы.

Опрос

Как вы будете использовать этот урок?

Прочитайте его и выполните упражнения. Прочтите только это

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Опытный

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Опытный

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта.
  • Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

3. Включите API перевода.

Вместо этого для нашего примера приложения вы включите Cloud Translation API и службу App Engine, используя аналогичные инструкции, приведенные ниже.

Включение облачных API

Введение

Независимо от того, какие API Google вы хотите использовать в своем приложении, они должны быть включены . В следующем примере показаны два способа включения Cloud Vision API . После того, как вы узнаете, как включить один Cloud API, вы сможете включить и другие API, поскольку процесс аналогичен.

Вариант 1. Из Cloud Shell или интерфейса командной строки.

Хотя включение API из облачной консоли встречается чаще, некоторые разработчики предпочитают делать все из командной строки. Для этого вам нужно найти «имя службы» API. Это выглядит как URL-адрес: 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. Из облачной консоли.

Вы также можете включить Vision API в диспетчере API. В Cloud Console перейдите в API Manager и выберите Library .

fb0f1d315f122d4a.png

Если вы хотите включить API Cloud Vision, начните вводить слово «vision» в строке поиска, и появится все, что соответствует введенному вами на данный момент:

2275786a24f8f204.png

Выберите API, который вы хотите включить, и нажмите «Включить» :

2556f923b628e31.png

Расходы

Хотя многие API Google можно использовать бесплатно, использование продуктов и API Google Cloud не является бесплатным. При включении Cloud API вас могут попросить указать активную учетную запись для выставления счетов. Однако важно отметить, что некоторые продукты Google Cloud имеют уровень «Всегда бесплатно» (ежедневно/ежемесячно), который вам необходимо превысить, чтобы взиматься плата за выставление счетов; в противном случае с вашей кредитной карты (или указанного платежного инструмента) средства не будут сняты.

Перед включением пользователям следует ознакомиться с информацией о ценах на любой API, особенно отметив, есть ли у него уровень бесплатного пользования, и если да, то какой он. Если бы вы включали API Cloud Vision, вам следует проверить страницу с информацией о ценах . У Cloud Vision есть бесплатная квота, и пока вы в совокупности (в течение каждого месяца) не выходите за ее пределы, с вас не должно взиматься никаких расходов.

Цены и уровни бесплатного пользования различаются в зависимости от API Google. Примеры:

Различные продукты Google оплачиваются по-разному, поэтому обязательно обратитесь к документации вашего API для получения этой информации.

Краткое содержание

Теперь, когда вы знаете, как в целом включить API Google, перейдите в диспетчер API и включите Cloud Translation API и службу App Engine (если вы еще этого не сделали), первый, потому что наше приложение будет использовать его, а второй. потому что вы развертываете приложение App Engine. Если вы предпочитаете делать это из командной строки, введите вместо этого следующую команду:

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

Хотя его ежемесячная квота не указана на общей сводной странице уровня «Всегда бесплатно» , на странице цен API перевода указано, что все пользователи ежемесячно получают фиксированное количество переведенных символов . Вы не должны нести никаких расходов со стороны API, если ваш уровень ниже этого порога. Если есть какие-либо другие сборы, связанные с Google Cloud, они будут обсуждаться в конце раздела «Очистка».

4. Получите пример кода приложения.

Клонируйте код в репозитории локально или в Cloud Shell (с помощью команды git clone ) или загрузите ZIP-файл с помощью зеленой кнопки «Код» , как показано на следующем снимке экрана:

5cd6110c4414cf65.png

Теперь, когда у вас есть все, создайте полную копию папки для выполнения этого конкретного руководства, поскольку оно, скорее всего, потребует удаления или изменения файлов. Если вы хотите выполнить другое развертывание, вы можете начать заново, скопировав оригинал, чтобы вам не приходилось клонировать или загружать его снова.

5. Обзор примера приложения

Пример приложения представляет собой простую производную версию Google Translate , которая предлагает пользователям вводить текст на английском языке и получать эквивалентный перевод этого текста на испанском языке. Теперь откройте файл 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)))
  1. Импорт добавляет функциональность Flask, модуль google.auth и клиентскую библиотеку Cloud Translation API.
  2. Глобальные переменные представляют приложение Flask, идентификатор облачного проекта, клиент API перевода, родительский «путь к местоположению» для вызовов API перевода, а также исходный и целевой языки. В данном случае это английский ( en ) и испанский ( es ), но вы можете изменить эти значения на другие языковые коды , поддерживаемые Cloud Translation API .
  3. Большой блок if внизу используется в руководстве для локального запуска этого приложения — он использует сервер разработки Flask для обслуживания нашего приложения. В этом разделе также представлены учебные пособия по развертыванию Cloud Run на случай, если веб-сервер не включен в контейнер. Вас попросят включить объединение сервера в контейнер, но если вы пропустите это, код приложения вернется к использованию сервера разработки Flask. (Это не проблема с App Engine или облачными функциями, поскольку это платформы на основе исходных кодов, то есть 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)

Основная функция выполняет работу по приему пользовательского ввода и вызову API перевода для выполнения тяжелой работы. Давайте разберемся:

  1. Проверьте, поступают ли запросы от облачных функций, используя переменную local_request . Cloud Functions отправляет свой собственный объект запроса Flask, тогда как все остальные (выполняющиеся локально или развертывающиеся в App Engine или Cloud Run) получают объект запроса непосредственно из Flask.
  2. Сбросьте основные переменные формы. В первую очередь это касается запросов GET, поскольку запросы POST будут содержать данные, заменяющие их.
  3. Если это POST, возьмите текст для перевода и создайте структуру JSON, представляющую требования к метаданным API. Затем вызовите API, вернувшись к предыдущей версии API, если пользователь использует более старую библиотеку.
  4. В любом случае, отформатируйте фактические результаты (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. Установите локальные пакеты/зависимости (в библиотеку).

Как упоминалось ранее, пример приложения использует микровеб-инфраструктуру Flask и клиентскую библиотеку Google Cloud Translation API для Python. Установите и обновите pip плюс эту пару пакетов с помощью этой команды pip (или pip3 ):

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

Теперь, когда ваше приложение доступно по всему миру, вы сможете получить к нему доступ по URL-адресу (содержащему идентификатор вашего проекта), указанному в результатах развертывания:

da28f951c33a2c3d.png

Переведите что-нибудь, чтобы увидеть, как это работает!

d911984d15dd5ef9.png

8. Заключение

Поздравляем! Вы узнали, как включить Cloud Translation API, получить необходимые учетные данные и развернуть простое веб-приложение в Python 2 App Engine! Подробнее об этом развертывании можно узнать из этой таблицы в репозитории .

Очистить

Cloud Translation API позволяет бесплатно переводить фиксированное количество символов в месяц . App Engine также имеет бесплатную квоту , то же самое касается Cloud Functions и Cloud Run . Если одно из этих значений будет превышено, с вас будет взиматься плата. Если вы планируете перейти к следующей лаборатории кода, вам не нужно закрывать приложение.

Однако, если вы еще не готовы перейти к следующему руководству или обеспокоены тем, что Интернет обнаружит только что развернутое вами приложение, отключите приложение App Engine , удалите функцию Cloud или отключите службу Cloud Run, чтобы избежать несение расходов. Когда вы будете готовы перейти к следующей лаборатории кода, вы можете снова включить ее. С другой стороны, если вы не собираетесь продолжать работу с этим приложением или другими лабораториями кода и хотите полностью удалить все, вы можете закрыть свой проект .

Кроме того, развертывание на бессерверной вычислительной платформе Google Cloud требует незначительных затрат на сборку и хранение . Cloud Build имеет собственную бесплатную квоту, как и Cloud Storage . Для большей прозрачности Cloud Build создает образ вашего приложения, который затем сохраняется либо в реестре облачных контейнеров , либо в реестре артефактов , его преемнике. Хранение этого изображения использует часть этой квоты, как и выходная сеть при передаче этого изображения в службу. Однако вы можете жить в регионе, где нет такого уровня бесплатного пользования, поэтому следите за использованием своего хранилища, чтобы минимизировать потенциальные затраты.

9. Дополнительные ресурсы

В следующих разделах вы можете найти дополнительные материалы для чтения, а также рекомендуемые упражнения, которые помогут расширить ваши знания, полученные в результате прохождения этого руководства.

Дополнительное исследование

Теперь, когда у вас есть некоторый опыт работы с API перевода, давайте выполним несколько дополнительных упражнений для дальнейшего развития ваших навыков. Чтобы продолжить обучение, измените наш пример приложения, чтобы он выполнял следующие действия:

  1. Завершите все остальные версии этой лаборатории кода для локального запуска или развертывания на бессерверных вычислительных платформах Google Cloud (см. README репозитория ).
  2. Выполните это руководство, используя другой язык программирования.
  3. Измените это приложение, чтобы оно поддерживало разные исходные или целевые языки.
  4. Обновите это приложение, чтобы иметь возможность переводить текст на несколько языков; измените файл шаблона, чтобы в нем был раскрывающийся список поддерживаемых целевых языков.

Узнать больше

Google App Engine

Облачные функции Google

Google Cloud Run

Пакеты сборки Google Cloud, реестр контейнеров, реестр артефактов

Google Cloud Translation и Google ML Kit

Другие продукты/страницы Google Cloud

Питон и колба

Лицензия

Это руководство доступно под лицензией Creative Commons Attribution 2.0 Generic License, а исходный код в репозитории — под лицензией Apache 2.