Упражнение. Вызов службы "Переводчик"
Внутренняя служба "Переводчик" уже создана в Azure и переменные для работы с ней уже настроены, а теперь мы добавим в приложение логику и шаблон для перевода текста. Мы выполним следующие действия:
- добавление кода для вызова службы;
- Создание шаблона для вывода результатов
- тестирование приложения.
добавление кода для вызова службы;
Логика приложения хранится в файле app.py. Для начала мы добавим несколько инструкций import для нужных нам библиотек, а затем создадим новый маршрут для ответа пользователю.
В самом начале файла app.py добавьте следующие строки кода:
import requests, os, uuid, json from dotenv import load_dotenv load_dotenv()
Верхняя строка будет импортировать библиотеки, которые мы позже применим для вызова службы "Переводчик". Кроме того, мы импортируем load_dotenv
из dotenv
и вызовем функцию, которая загружает значения из файла ENV.
В самом конце файла app.py добавьте следующие строки кода, чтобы создать маршрут и логику для перевода текста:
@app.route('/', methods=['POST']) def index_post(): # Read the values from the form original_text = request.form['text'] target_language = request.form['language'] # Load the values from .env key = os.environ['KEY'] endpoint = os.environ['ENDPOINT'] location = os.environ['LOCATION'] # Indicate that we want to translate and the API version (3.0) and the target language path = '/translate?api-version=3.0' # Add the target language parameter target_language_parameter = '&to=' + target_language # Create the full URL constructed_url = endpoint + path + target_language_parameter # Set up the header information, which includes our subscription key headers = { 'Ocp-Apim-Subscription-Key': key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json', 'X-ClientTraceId': str(uuid.uuid4()) } # Create the body of the request with the text to be translated body = [{ 'text': original_text }] # Make the call using post translator_request = requests.post(constructed_url, headers=headers, json=body) # Retrieve the JSON response translator_response = translator_request.json() # Retrieve the translation translated_text = translator_response[0]['translations'][0]['text'] # Call render template, passing the translated text, # original text, and target language to the template return render_template( 'results.html', translated_text=translated_text, original_text=original_text, target_language=target_language )
В код добавлены комментарии с описанием выполняемых действий. На высоком уровне этот код выполняет следующее:
- Считывает введенный пользователем текст и выбранный в форме язык.
- Считывает ранее созданные переменные среды из файла ENV.
- Создает необходимый путь для вызова службы "Переводчик", в который включает целевой язык (исходный язык определяется автоматически).
- Подготавливает сведения для заголовков, в том числе ключ для службы "Переводчик", расположение службы и произвольный идентификатор для перевода.
- Создает текст запроса с текстом для перевода.
- Вызывает
post
изrequests
, чтобы обратиться к службе "Переводчик". - Получает от сервера ответ в формате JSON, который содержит переведенный текст.
- Извлекает переведенный текст (см. следующую заметку).
- Вызывает
render_template
для вывода страницы ответа.
Примечание.
При вызове службы "Переводчик" можно перевести несколько выражений на несколько языков одним запросом. Это означает, что возвращенный службой ответ в формате JSON содержит много информации, из которой нам нужна лишь малая часть. Поэтому переведенный текст мы будем извлекать на несколько уровней ниже.
В частности, нам сначала нужно получить первый результат, затем коллекцию translations
с первым переводом, а затем text
. Для этого используется такой вызов: translator_response[0]['translations'][0]['text']
[
{
"detectedLanguage": {
"language": "en",
"score": 1.0
},
"translations": [
{
"text": "これはテストです",
"to": "ja"
}
]
}
]
Создание шаблона для вывода результатов
Теперь мы создадим шаблон HTML для страницы результатов.
Создайте новый файл в папке templates, выбрав templates в средстве Проводник в Visual Studio Code. Выберите пункт Новый файл.
Присвойте этому файлу имя results.html.
Добавьте следующий код HTML в файл results.html.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"> <title>Result</title> </head> <body> <div class="container"> <h2>Results</h2> <div> <strong>Original text:</strong> {{ original_text }} </div> <div> <strong>Translated text:</strong> {{ translated_text }} </div> <div> <strong>Target language code:</strong> {{ target_language }} </div> <div> <a href="{{ url_for('index') }}">Try another one!</a> </div> </div> </body> </html>
Как видите, здесь мы обращаемся к original_text
, translated_text
и target_language
, которые переданы в render_template
как именованные параметры, используя {{ }}
. Эта операция сообщает Flask, что содержимое нужно отображать как обычный текст. Мы также с помощью url_for('index')
создаем обратную ссылку на страницу по умолчанию. С технической точки зрения мы могли бы просто ввести путь к исходной странице, но url_for
указывает Flask считать путь к функции с указанным именем (в нашем примере это index
). Благодаря этому созданный URL-адрес всегда будет действовать правильно, даже если мы изменим структуру сайта.
Тестирование страницы
Вернитесь к встроенному терминалу Visual Studio Code (или снова откройте его с помощью клавиш CTRL+` или CMD+` на компьютере Mac). Если сайт уже работает, его нужно перезапустить, чтобы приложение считало новые переменные среды.
Чтобы остановить приложение, нажмите клавиши CTRL+C.
Выполните команду
flask run
, чтобы перезапустить службу.В браузере перейдите по адресу http://localhost:5000, чтобы протестировать приложение.
Введите текст в текстовое поле, выберите язык и нажмите кнопку Translate (Перевести).
Вы получите результат перевода.
Поздравляем!
Итак, вы успешно создали веб-сайт, который использует службу "Переводчик" для перевода текста. Вы можете обратить внимание, что результаты не всегда идеальны, так как язык и взаимодействие зависят от контекста, который не всегда понятен компьютерам. Но вы будете получать достаточно точный результат почти всегда, что вполне достаточно для эффективного взаимодействия.
Приведенный здесь код можно встроить в любое приложение. Вы можете продолжить работу над созданным веб-сайтом, или даже развернуть его в Службе приложений Azure.