Настройка API с использованием Flask, Google Cloud SQL и App Engine

Опубликовано: 2022-03-10
Краткое резюме ↬ Flask позволяет разработчикам создавать API для любого варианта использования, который у них может быть. В этом руководстве мы узнаем, как настроить Google Cloud, Cloud SQL и App Engine для создания Flask API. (Cloud SQL — это полностью управляемый механизм базы данных «платформа как услуга» (PaaS), а App Engine — полностью управляемый PaaS для размещения приложений.)

Для создания API можно использовать несколько фреймворков Python, два из которых — Flask и Django. Фреймворки поставляются с функциями, которые позволяют разработчикам легко реализовывать функции, необходимые пользователям для взаимодействия с их приложениями. Сложность веб-приложения может быть решающим фактором при выборе фреймворка для работы.

Джанго

Django — это надежный фреймворк с предопределенной структурой и встроенными функциями. Однако недостатком его надежности является то, что он может сделать структуру слишком сложной для определенных проектов. Он лучше всего подходит для сложных веб-приложений, которым необходимо использовать расширенные функции Django.

Колба

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

В целях обучения мы создадим Flask API с несколькими конечными точками для управления коллекцией наших любимых песен. Конечные точки будут для запросов GET и POST : получение и создание ресурсов. При этом мы будем использовать набор сервисов на платформе Google Cloud. Мы настроим Google Cloud SQL для нашей базы данных и запустим наше приложение, развернув его в App Engine. Это руководство предназначено для начинающих, которые впервые пытаются использовать Google Cloud для своего приложения.

Настройка проекта Flask

В этом руководстве предполагается, что у вас установлен Python 3.x. Если нет, зайдите на официальный сайт, чтобы загрузить и установить его.

Чтобы проверить, установлен ли Python, запустите интерфейс командной строки (CLI) и выполните следующую команду:

 python -V

Наш первый шаг — создать каталог, в котором будет жить наш проект. Мы назовем его flask-app :

 mkdir flask-app && cd flask-app

Первое, что нужно сделать при запуске проекта Python, — это создать виртуальную среду. Виртуальные среды изолируют вашу рабочую разработку Python. Это означает, что этот проект может иметь свои собственные зависимости, отличные от других проектов на ваших машинах. venv — это модуль, который поставляется с Python 3.

Еще после прыжка! Продолжить чтение ниже ↓

Давайте создадим виртуальную среду в нашем каталоге flask-app :

 python3 -m venv env

Эта команда создает папку env в нашем каталоге. Имя (в данном случае env ) является псевдонимом виртуальной среды и может называться как угодно.

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

 source env/bin/activate

Вы увидите, что ваше приглашение CLI теперь имеет env в начале, что указывает на то, что наша среда активна.

Он показывает приглашение env, чтобы указать, что среда активна.
(env) появляется перед подсказкой (большой предварительный просмотр)

Теперь давайте установим наш пакет Flask:

 pip install flask

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

 mkdir api && cd api

Затем создайте файл main.py , который будет служить точкой входа в наше приложение:

 touch main.py

Откройте main.py и введите следующий код:

 #main.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Hello World' if __name__ == '__main__': app.run()

Давайте разберемся, что мы здесь сделали. Сначала мы импортировали класс Flask из пакета Flask. Затем мы создали экземпляр класса и присвоили его app . Затем мы создали нашу первую конечную точку, которая указывает на корень нашего приложения. Подводя итог, можно сказать, что это функция представления, которая вызывает маршрут / и возвращает Hello World .

Запустим приложение:

 python main.py

Это запускает наш локальный сервер и обслуживает наше приложение по https://127.0.0.1:5000/ . Введите URL-адрес в браузере, и вы увидите ответ Hello World , напечатанный на вашем экране.

И вуаля! Наше приложение запущено и работает. Следующая задача — сделать его функциональным.

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

Давайте заставим main.py возвращать некоторые данные:

 #main.py from flask import Flask, jsonify app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) if __name__ == '__main__': app.run()

Здесь мы включили список песен, включая название песни и имя исполнителя. Затем мы изменили корень / маршрут на /songs . Этот маршрут возвращает указанный нами массив песен. Чтобы получить наш список в виде значения JSON, мы преобразовали список в JSON, передав его через jsonify . Теперь вместо того, чтобы видеть простое Hello world , мы видим список исполнителей при доступе к конечной точке https://127.0.0.1:5000/songs .

На этом изображении показан ответ на запрос на получение
get ответ от почтальона (большой предварительный просмотр)

Вы могли заметить, что после каждого изменения нам приходилось перезагружать наш сервер. Чтобы включить автоматическую перезагрузку при изменении кода, давайте включим опцию отладки. Для этого измените app.run на это:

 app.run(debug=True)

Далее добавим песню с помощью почтового запроса в наш массив. Во-первых, импортируйте объект request , чтобы мы могли обрабатывать входящие запросы от наших пользователей. Позже мы будем использовать объект request в функции представления, чтобы получить ввод пользователя в формате JSON.

 #main.py from flask import Flask, jsonify, request app = Flask(__name__) songs = [ { "title": "Rockstar", "artist": "Dababy", "genre": "rap", }, { "title": "Say So", "artist": "Doja Cat", "genre": "Hiphop", }, { "title": "Panini", "artist": "Lil Nas X", "genre": "Hiphop" } ] @app.route('/songs') def home(): return jsonify(songs) @app.route('/songs', methods=['POST']) def add_songs(): song = request.get_json() songs.append(song) return jsonify(songs) if __name__ == '__main__': app.run(debug=True)

Наша функция просмотра add_songs берет песню, отправленную пользователем, и добавляет ее в наш существующий список песен.

Это изображение демонстрирует почтовый запрос с использованием Postman.
Почтовый запрос от Почтальона (Большой превью)

До сих пор мы возвращали наши данные из списка Python. Это просто экспериментально, потому что в более надежной среде наши вновь добавленные данные будут потеряны, если мы перезапустим сервер. Это невозможно, поэтому нам потребуется живая база данных для хранения и извлечения данных. Входит Cloud SQL.

Зачем использовать экземпляр Cloud SQL?

Согласно официальному сайту:

«Google Cloud SQL — это полностью управляемая служба баз данных, которая упрощает настройку, обслуживание, управление и администрирование ваших реляционных баз данных MySQL и PostgreSQL в облаке. Cloud SQL, размещенный на облачной платформе Google, предоставляет инфраструктуру базы данных для приложений, работающих где угодно».

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

Разница между Cloud SQL и самоуправляемой вычислительной машиной

В Google Cloud мы можем развернуть виртуальную машину в инфраструктуре Google Compute Engine и установить наш экземпляр SQL. Это означает, что мы будем нести ответственность за вертикальную масштабируемость, репликацию и множество других настроек. С Cloud SQL мы получаем множество настроек из коробки, поэтому мы можем тратить больше времени на код и меньше времени на настройку.

Прежде чем мы начнем:

  1. Зарегистрируйтесь в Google Cloud. Google предлагает новым пользователям бесплатный кредит в размере 300 долларов США.
  2. Создайте проект. Это довольно просто и может быть сделано прямо из консоли.

Создайте экземпляр Cloud SQL

После регистрации в Google Cloud на левой панели прокрутите до вкладки «SQL» и нажмите на нее.

На этом изображении показан подраздел услуг GCP.
Снимок сервисов GCP (большой предварительный просмотр)
На этом изображении показаны три ядра базы данных, предлагаемые для Cloud SQL.
Страница консоли Cloud SQL (большой предварительный просмотр)

Во-первых, нам необходимо выбрать механизм SQL. В этой статье мы выберем MySQL.

На этом изображении показана страница для создания экземпляра Cloud SQL.
Создание нового экземпляра Cloud SQL (большая предварительная версия)

Далее мы создадим экземпляр. По умолчанию наш инстанс будет создан в США, и зона будет выбрана для нас автоматически.

Установите пароль root и дайте экземпляру имя, а затем нажмите кнопку «Создать». Вы можете дополнительно настроить экземпляр, щелкнув раскрывающийся список «Показать параметры конфигурации». Настройки позволяют настроить размер экземпляра, емкость хранилища, безопасность, доступность, резервное копирование и многое другое. В этой статье мы будем использовать настройки по умолчанию. Не беспокойтесь, эти переменные можно изменить позже.

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

Теперь, когда мы готовы, мы сделаем несколько вещей:

  1. Создайте базу данных.
  2. Создайте нового пользователя.
  3. Белый список нашего IP-адреса.

Создать базу данных

Перейдите на вкладку «База данных», чтобы создать базу данных.

На этом изображении показано создание нового пользователя в Cloud SQL.
Создание новой базы данных в Cloud SQL (большая предварительная версия)

Создать нового пользователя

Создание нового пользователя в Cloud SQL (большая предварительная версия)

В разделе «Имя хоста» установите для него разрешение «% (любой хост)».

Белый список IP-адресов

Вы можете подключиться к экземпляру базы данных одним из двух способов. Для частного IP -адреса требуется виртуальное частное облако (VPC). Если вы выберете этот вариант, Google Cloud создаст VPC, управляемый Google, и разместит в нем ваш экземпляр. В этой статье мы будем использовать общедоступный IP -адрес, который используется по умолчанию. Она является общедоступной в том смысле, что доступ к базе данных могут получить только люди, IP-адреса которых занесены в белый список.

Чтобы внести свой IP-адрес в белый список, введите my ip IP-адрес в поиске Google, чтобы получить свой IP-адрес. Затем перейдите на вкладку «Подключения» и «Добавить сеть».

На этом изображении показана страница белого списка IP-адресов.
Белый список вашего IP-адреса (большой предварительный просмотр)

Подключиться к экземпляру

Далее перейдите на панель «Обзор» и подключитесь с помощью облачной оболочки.

На этом изображении показана панель мониторинга Cloud SQL.
Панель инструментов Cloud SQL (большая предварительная версия)

Команда для подключения к нашему экземпляру Cloud SQL будет предварительно введена в консоли.

Вы можете использовать либо пользователя root, либо пользователя, созданного ранее. В приведенной ниже команде мы говорим: подключитесь к экземпляру flask-demo от имени пользователя USERNAME . Вам будет предложено ввести пароль пользователя.

 gcloud sql connect flask-demo --user=USERNAME

Если вы получаете сообщение об ошибке, говорящее, что у вас нет идентификатора проекта, вы можете получить идентификатор своего проекта, выполнив это:

 gcloud projects list

Возьмите идентификатор проекта, который был выведен из приведенной выше команды, и введите его в приведенную ниже команду, заменив им PROJECT_ID .

 gcloud config set project PROJECT_ID

Затем запустите команду gcloud sql connect , и мы подключимся.

Запустите эту команду, чтобы увидеть активные базы данных:

 > show databases; 
На этом изображении показан вывод оболочки, когда мы запускаем базы данных show в облачной оболочке.
Вывод оболочки для «показать базы данных» (большой предварительный просмотр)

Моя база данных называется db_demo , и я выполню приведенную ниже команду, чтобы использовать базу данных db_demo . Вы можете увидеть некоторые другие базы данных, такие как information_schema и performance_schema . Они предназначены для хранения метаданных таблицы.

 > use db_demo;

Затем создайте таблицу, которая отражает список из нашего приложения Flask. Введите приведенный ниже код в блокнот и вставьте его в облачную оболочку:

 create table songs( song_id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255), artist VARCHAR(255), genre VARCHAR(255), PRIMARY KEY(song_id) );

Этот код представляет собой команду SQL, которая создает таблицу с именем songs с четырьмя столбцами ( song_id , title , artist и genre ). Мы также указали, что таблица должна определять song_id как первичный ключ и автоматически увеличиваться с 1.

Теперь запустите show tables; чтобы подтвердить, что таблица создана.

На этом изображении показан вывод оболочки при запуске таблиц show в облачной оболочке.
Вывод оболочки для «показать таблицы» (большой предварительный просмотр)

Вот так мы создали базу данных и нашу таблицу songs .

Наша следующая задача — настроить Google App Engine, чтобы мы могли развернуть наше приложение.

Сервер приложений Google

App Engine — это полностью управляемая платформа для разработки и размещения веб-приложений в любом масштабе. Преимущество развертывания в App Engine заключается в том, что оно позволяет автоматически масштабировать приложение в соответствии с входящим трафиком.

На веб-сайте App Engine говорится:

«При нулевом управлении сервером и нулевом развертывании конфигурации разработчики могут сосредоточиться только на создании отличных приложений без дополнительных затрат на управление».

Настроить App Engine

Есть несколько способов настроить App Engine: через пользовательский интерфейс Google Cloud Console или с помощью Google Cloud SDK. Мы будем использовать SDK для этого раздела. Это позволяет нам развертывать, управлять и контролировать наш экземпляр Google Cloud с нашего локального компьютера.

Установите Google Cloud SDK

Следуйте инструкциям, чтобы загрузить и установить SDK для Mac или Windows. В руководстве также показано, как инициализировать SDK в интерфейсе командной строки и как выбрать проект Google Cloud.

Теперь, когда SDK установлен, мы собираемся обновить наш скрипт Python, указав учетные данные нашей базы данных, и выполнить развертывание в App Engine.

Локальная установка

В нашей локальной среде мы собираемся обновить настройку в соответствии с нашей новой архитектурой, которая включает Cloud SQL и App Engine.

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

В файл app.yaml добавьте приведенный ниже фрагмент. Вы получите переменные среды выполнения и базы данных при настройке базы данных. Замените значения именем пользователя, паролем, именем базы данных и именем подключения, которые вы использовали при настройке Cloud SQL.

 #app.yaml runtime: python37 env_variables: CLOUD_SQL_USERNAME: YOUR-DB-USERNAME CLOUD_SQL_PASSWORD: YOUR-DB-PASSWORD CLOUD_SQL_DATABASE_NAME: YOUR-DB-NAME CLOUD_SQL_CONNECTION_NAME: YOUR-CONN-NAME

Теперь мы собираемся установить PyMySQL. Это пакет Python MySQL, который подключается и выполняет запросы к базе данных MySQL. Установите пакет PyMySQL, запустив эту строку в CLI:

 pip install pymysql

На данный момент мы готовы использовать PyMySQL для подключения к нашей базе данных Cloud SQL из приложения. Это позволит нам получать и вставлять запросы в нашу базу данных.

Инициализировать соединитель базы данных

Сначала создайте файл db.py в нашей корневой папке и добавьте следующий код:

 #db.py import os import pymysql from flask import jsonify db_user = os.environ.get('CLOUD_SQL_USERNAME') db_password = os.environ.get('CLOUD_SQL_PASSWORD') db_name = os.environ.get('CLOUD_SQL_DATABASE_NAME') db_connection_name = os.environ.get('CLOUD_SQL_CONNECTION_NAME') def open_connection(): unix_socket = '/cloudsql/{}'.format(db_connection_name) try: if os.environ.get('GAE_ENV') == 'standard': conn = pymysql.connect(user=db_user, password=db_password, unix_socket=unix_socket, db=db_name, cursorclass=pymysql.cursors.DictCursor ) except pymysql.MySQLError as e: print(e) return conn def get_songs(): conn = open_connection() with conn.cursor() as cursor: result = cursor.execute('SELECT * FROM songs;') songs = cursor.fetchall() if result > 0: got_songs = jsonify(songs) else: got_songs = 'No Songs in DB' conn.close() return got_songs def add_songs(song): conn = open_connection() with conn.cursor() as cursor: cursor.execute('INSERT INTO songs (title, artist, genre) VALUES(%s, %s, %s)', (song["title"], song["artist"], song["genre"])) conn.commit() conn.close()

Мы сделали несколько вещей здесь.

Во-первых, мы получили учетные данные нашей базы данных из файла app.yaml с помощью метода os.environ.get . App Engine может сделать переменные среды, определенные в app.yaml , доступными в приложении.

Во-вторых, мы создали функцию open_connection . Он подключается к нашей базе данных MySQL с учетными данными.

В-третьих, мы добавили две функции: get_songs и add_songs . Первый инициирует соединение с базой данных, вызывая функцию open_connection . Затем он запрашивает таблицу songs для каждой строки и, если она пуста, возвращает «Нет песен в БД». Функция add_songs вставляет новую запись в таблицу songs .

Наконец, мы возвращаемся к тому, с чего начали, к нашему файлу main.py Теперь вместо получения песен из объекта, как мы делали ранее, мы вызываем функцию add_songs для вставки записи и вызываем функцию get_songs для извлечения записей из базы данных.

Проведем рефакторинг main.py :

 #main.py from flask import Flask, jsonify, request from db import get_songs, add_songs app = Flask(__name__) @app.route('/', methods=['POST', 'GET']) def songs(): if request.method == 'POST': if not request.is_json: return jsonify({"msg": "Missing JSON in request"}), 400 add_songs(request.get_json()) return 'Song Added' return get_songs() if __name__ == '__main__': app.run()

Мы импортировали функции get_songs и add_songs и вызвали их в нашей функции представления songs() . Если мы делаем запрос на post , мы вызываем функцию add_songs , а если мы делаем запрос на get , мы вызываем функцию get_songs .

И наше приложение готово.

Далее нужно добавить файл requirements.txt . Этот файл содержит список пакетов, необходимых для запуска приложения. App Engine проверяет этот файл и устанавливает перечисленные пакеты.

 pip freeze | grep "Flask\|PyMySQL" > requirements.txt

Эта строка получает два пакета, которые мы используем для приложения (Flask и PyMySQL), создает файл requirements.txt и добавляет пакеты и их версии в файл.

На данный момент мы добавили три новых файла: db.py , app.yaml и requirements.txt .

Развертывание в Google App Engine

Выполните следующую команду, чтобы развернуть приложение:

 gcloud app deploy

Если все прошло хорошо, ваша консоль выведет это:

На этом изображении показан результат развертывания в App Engine.
Выходные данные CLI для развертывания App Engine (большая предварительная версия)

Теперь ваше приложение работает в App Engine. Чтобы увидеть его в браузере, запустите gcloud app browse в интерфейсе командной строки.

Мы можем запустить Postman, чтобы протестировать нашу post и get запросы.

На этом изображении показан почтовый запрос к нашему развернутому приложению.
Демонстрация почтового запроса (большой предварительный просмотр)
Это изображение демонстрирует запрос на получение нашего развернутого приложения.
Демонстрация запроса на get (большой предварительный просмотр)

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

Заключение

Использование инфраструктуры «платформа как услуга» (PaaS), такой как App Engine и Cloud SQL, в основном абстрагирует уровень инфраструктуры и позволяет нам строить быстрее. Как разработчики, нам не нужно беспокоиться о конфигурации, резервном копировании и восстановлении, операционной системе, автомасштабировании, брандмауэрах, переносе трафика и так далее. Однако, если вам нужен контроль над базовой конфигурацией, может быть лучше использовать специально созданную службу.

использованная литература

  • «Скачать Python»
  • «venv — Создание виртуальных сред», Python (документация)
  • «Скачать Почтальон»
  • «Облачный SQL», Google Cloud
  • Облако Google
  • «Уровень бесплатного пользования Google Cloud», Google Cloud
  • «Создание проектов и управление ими», Google Cloud
  • «Обзор VPC» (виртуальное частное облако), Google Cloud
  • «App Engine», Google Cloud
  • «Быстрый старт» (скачать Google Cloud SDK), Google Cloud
  • документация по PyMySQL