Konfigurowanie interfejsu API za pomocą Flask, Google Cloud SQL i App Engine

Opublikowany: 2022-03-10
Szybkie podsumowanie ↬ Flask umożliwia programistom zbudowanie interfejsu API dla dowolnego przypadku użycia. W tym samouczku dowiemy się, jak skonfigurować Google Cloud, Cloud SQL i App Engine w celu utworzenia interfejsu Flask API. (Cloud SQL to w pełni zarządzany silnik bazy danych platformy jako usługi (PaaS), a App Engine to w pełni zarządzany mechanizm PaaS do hostowania aplikacji).

Do tworzenia interfejsów API można użyć kilku frameworków Pythona, z których dwa to Flask i Django. Frameworks zawiera funkcjonalność, która ułatwia programistom implementację funkcji potrzebnych użytkownikom do interakcji z ich aplikacjami. Złożoność aplikacji internetowej może być decydującym czynnikiem przy wyborze frameworka do pracy.

Django

Django to solidny framework, który ma predefiniowaną strukturę z wbudowaną funkcjonalnością. Wadą jego solidności jest jednak to, że może sprawić, że struktura będzie zbyt skomplikowana dla niektórych projektów. Najlepiej nadaje się do złożonych aplikacji internetowych, które muszą wykorzystywać zaawansowaną funkcjonalność Django.

Kolba

Z drugiej strony Flask to lekka platforma do tworzenia interfejsów API. Rozpoczęcie pracy z nim jest łatwe, a dostępne są pakiety, które zapewniają jego niezawodność na bieżąco. W tym artykule skupimy się na zdefiniowaniu funkcji widoku i kontrolera oraz na połączeniu z bazą danych w Google Cloud i wdrożeniu w Google Cloud.

W celu nauki stworzymy Flask API z kilkoma punktami końcowymi do zarządzania kolekcją naszych ulubionych piosenek. Punktami końcowymi będą żądania GET i POST : pobieranie i tworzenie zasobów. Oprócz tego będziemy korzystać z pakietu usług na platformie Google Cloud. Skonfigurujemy Google Cloud SQL dla naszej bazy danych i uruchomimy naszą aplikację, wdrażając ją w App Engine. Ten samouczek jest skierowany do początkujących, którzy po raz pierwszy zaczynają używać Google Cloud w swojej aplikacji.

Konfigurowanie projektu kolby

W tym samouczku założono, że masz zainstalowany Python 3.x. Jeśli nie, przejdź na oficjalną stronę internetową, aby ją pobrać i zainstalować.

Aby sprawdzić, czy Python jest zainstalowany, uruchom interfejs wiersza poleceń (CLI) i uruchom poniższe polecenie:

 python -V

Naszym pierwszym krokiem jest stworzenie katalogu, w którym będzie żył nasz projekt. Nazwiemy to flask-app :

 mkdir flask-app && cd flask-app

Pierwszą rzeczą do zrobienia podczas uruchamiania projektu w Pythonie jest stworzenie środowiska wirtualnego. Środowiska wirtualne izolują Twój działający rozwój Pythona. Oznacza to, że ten projekt może mieć własne zależności, różne od innych projektów na twoich maszynach. venv to moduł dostarczany z Pythonem 3.

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Stwórzmy wirtualne środowisko w naszym katalogu flask-app :

 python3 -m venv env

To polecenie tworzy folder env w naszym katalogu. Nazwa (w tym przypadku env ) jest aliasem środowiska wirtualnego i może mieć dowolną nazwę.

Teraz, gdy stworzyliśmy środowisko wirtualne, musimy powiedzieć naszemu projektowi, aby z niego korzystał. Aby aktywować nasze środowisko wirtualne, użyj następującego polecenia:

 source env/bin/activate

Zobaczysz, że twój monit CLI ma teraz env na początku, wskazując, że nasze środowisko jest aktywne.

Wyświetla monit env, aby wskazać, że środowisko jest aktywne
(env) pojawia się przed monitem (duży podgląd)

Teraz zainstalujmy nasz pakiet Flask:

 pip install flask

Utwórz katalog o nazwie api w naszym bieżącym katalogu. Tworzymy ten katalog, aby mieć folder, w którym będą znajdować się inne foldery naszej aplikacji.

 mkdir api && cd api

Następnie utwórz plik main.py , który posłuży jako punkt wejścia do naszej aplikacji:

 touch main.py

Otwórz main.py i wprowadź następujący kod:

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

Zrozummy, co tutaj zrobiliśmy. Najpierw zaimportowaliśmy klasę Flask z pakietu Flask. Następnie utworzyliśmy instancję klasy i przypisaliśmy ją do app . Następnie utworzyliśmy nasz pierwszy punkt końcowy, który wskazuje na katalog główny naszej aplikacji. Podsumowując, jest to funkcja widoku, która wywołuje / route — zwraca Hello World .

Uruchommy aplikację:

 python main.py

To uruchamia nasz lokalny serwer i obsługuje naszą aplikację na https://127.0.0.1:5000/ . Wprowadź adres URL w przeglądarce, a zobaczysz odpowiedź Hello World wydrukowaną na ekranie.

I voila! Nasza aplikacja działa. Kolejnym zadaniem jest uczynienie go funkcjonalnym.

Do wywoływania naszych punktów końcowych użyjemy Postmana, który jest usługą pomagającą programistom testować punkty końcowe. Możesz go pobrać z oficjalnej strony internetowej.

Sprawmy, aby main.py zwrócił jakieś dane:

 #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()

Tutaj zamieściliśmy listę utworów, w tym tytuł utworu i nazwę wykonawcy. Następnie zmieniliśmy katalog główny / route na /songs . Ta trasa zwraca określoną przez nas tablicę utworów. Aby otrzymać naszą listę jako wartość JSON, zmodyfikowaliśmy ją w JSON, przekazując ją przez jsonify . Teraz zamiast prostego Hello world , widzimy listę wykonawców, gdy uzyskujemy dostęp do punktu końcowego https://127.0.0.1:5000/songs .

Ten obraz przedstawia odpowiedź z żądania pobrania
get odpowiedź od listonosza (duży podgląd)

Być może zauważyłeś, że po każdej zmianie musieliśmy ponownie uruchamiać nasz serwer. Aby włączyć automatyczne ładowanie w przypadku zmiany kodu, włącz opcję debugowania. Aby to zrobić, zmień app.run na to:

 app.run(debug=True)

Następnie dodajmy piosenkę za pomocą żądania posta do naszej tablicy. Najpierw zaimportuj obiekt request , abyśmy mogli przetwarzać żądania przychodzące od naszych użytkowników. Później użyjemy obiektu request w funkcji widoku, aby uzyskać dane wejściowe użytkownika w formacie 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)

Nasza funkcja widoku add_songs pobiera utwór przesłany przez użytkownika i dołącza go do naszej istniejącej listy utworów.

Ten obraz przedstawia żądanie postu za pomocą Postman
Prośba o wysłanie od listonosza (duży podgląd)

Do tej pory zwracaliśmy nasze dane z listy Pythona. To jest tylko eksperymentalne, ponieważ w bardziej niezawodnym środowisku nasze nowo dodane dane zostałyby utracone, gdybyśmy zrestartowali serwer. Nie jest to możliwe, więc będziemy potrzebować działającej bazy danych do przechowywania i pobierania danych. Wchodzi Cloud SQL.

Dlaczego warto korzystać z instancji Cloud SQL?

Według oficjalnej strony internetowej:

„Google Cloud SQL to w pełni zarządzana usługa baz danych, która ułatwia konfigurowanie, utrzymywanie, zarządzanie i administrowanie relacyjnymi bazami danych MySQL i PostgreSQL w chmurze. Cloud SQL, hostowany na platformie Google Cloud Platform, zapewnia infrastrukturę bazy danych dla aplikacji działających w dowolnym miejscu”.

Oznacza to, że możemy zlecić zarządzanie infrastrukturą bazy danych całkowicie firmie Google, po elastycznych cenach.

Różnica między Cloud SQL a samozarządzającym się silnikiem obliczeniowym

W Google Cloud możemy uruchomić maszynę wirtualną w infrastrukturze Compute Engine Google i zainstalować naszą instancję SQL. Oznacza to, że będziemy odpowiedzialni za skalowalność pionową, replikację i wiele innych konfiguracji. Dzięki Cloud SQL otrzymujemy wiele konfiguracji od razu po wyjęciu z pudełka, dzięki czemu możemy poświęcić więcej czasu na kod, a mniej na konfigurację.

Zanim zaczniemy:

  1. Zarejestruj się w Google Cloud. Google oferuje nowym użytkownikom bezpłatny kredyt w wysokości 300 USD.
  2. Utwórz projekt. Jest to całkiem proste i można to zrobić bezpośrednio z konsoli.

Utwórz instancję Cloud SQL

Po zarejestrowaniu się w Google Cloud, w lewym panelu przewiń do zakładki „SQL” i kliknij na nią.

Ten obraz przedstawia podsekcję usług GCP
Migawka usług GCP (duży podgląd)
Ten obraz przedstawia trzy silniki baz danych w ofercie Cloud SQL
Strona konsoli Cloud SQL (duży podgląd)

Najpierw musimy wybrać silnik SQL. W tym artykule omówimy MySQL.

Ten obraz przedstawia stronę tworzenia instancji Cloud SQL
Tworzenie nowej instancji Cloud SQL (duży podgląd)

Następnie utworzymy instancję. Domyślnie nasza instancja zostanie utworzona w USA, a strefa zostanie automatycznie wybrana dla nas.

Ustaw hasło roota i nadaj instancji nazwę, a następnie kliknij przycisk "Utwórz". Możesz dalej skonfigurować instancję, klikając menu „Pokaż opcje konfiguracji”. Ustawienia pozwalają skonfigurować rozmiar instancji, pojemność pamięci, zabezpieczenia, dostępność, kopie zapasowe i nie tylko. W tym artykule przejdziemy do ustawień domyślnych. Nie martw się, te zmienne można później zmienić.

Proces może potrwać kilka minut. Będziesz wiedział, że instancja jest gotowa, gdy zobaczysz zielony znacznik wyboru. Kliknij nazwę swojej instancji, aby przejść do strony szczegółów.

Teraz, gdy już działamy, zrobimy kilka rzeczy:

  1. Utwórz bazę danych.
  2. Utwórz nowego użytkownika.
  3. Dodaj nasz adres IP do białej listy.

Utwórz bazę danych

Przejdź do zakładki „Baza danych”, aby utworzyć bazę danych.

Ten obraz przedstawia tworzenie nowego użytkownika w Cloud SQL
Tworzenie nowej bazy danych w Cloud SQL (duży podgląd)

Utwórz nowego użytkownika

Tworzenie nowego użytkownika w Cloud SQL (duży podgląd)

W sekcji „Nazwa hosta” ustaw ją tak, aby zezwalała na „% (dowolny host)”.

Adres IP na białej liście

Możesz połączyć się z instancją bazy danych na dwa sposoby. Prywatny adres IP wymaga wirtualnej chmury prywatnej (VPC). Jeśli wybierzesz tę opcję, Google Cloud utworzy zarządzany przez Google VPC i umieści w nim Twoją instancję. W tym artykule użyjemy publicznego adresu IP , który jest domyślny. Jest publiczny w tym sensie, że tylko osoby, których adresy IP zostały umieszczone na białej liście, mogą uzyskać dostęp do bazy danych.

Aby umieścić swój adres IP na białej liście, wpisz my ip w wyszukiwarce Google, aby uzyskać swój adres IP. Następnie przejdź do zakładki „Połączenia” i „Dodaj sieć”.

Ten obraz przedstawia stronę z białą listą adresów IP
Dodaj swój adres IP do białej listy (duży podgląd)

Połącz się z instancją

Następnie przejdź do panelu „Przegląd” i połącz się za pomocą powłoki chmury.

Ten obraz przedstawia panel Cloud SQL
Panel Cloud SQL (duży podgląd)

Polecenie połączenia z naszą instancją Cloud SQL zostanie wstępnie wpisane w konsoli.

Możesz użyć użytkownika root lub użytkownika, który został utworzony wcześniej. W poniższym poleceniu mówimy: Połącz się z instancją flask-demo jako użytkownik USERNAME . Zostaniesz poproszony o wprowadzenie hasła użytkownika.

 gcloud sql connect flask-demo --user=USERNAME

Jeśli pojawi się błąd mówiący, że nie masz identyfikatora projektu, możesz uzyskać identyfikator swojego projektu, uruchamiając to:

 gcloud projects list

Weź identyfikator projektu, który został wyprowadzony z powyższego polecenia i wprowadź go do poniższego polecenia, zastępując nim PROJECT_ID .

 gcloud config set project PROJECT_ID

Następnie uruchom polecenie gcloud sql connect i zostaniemy połączeni.

Uruchom to polecenie, aby zobaczyć aktywne bazy danych:

 > show databases; 
Ten obraz przedstawia dane wyjściowe powłoki, gdy uruchamiamy bazy danych show w powłoce chmury
Wyjście powłoki dla „pokaż bazy danych” (duży podgląd)

Moja baza danych nazywa się db_demo i uruchomię poniższe polecenie, aby użyć bazy danych db_demo . Możesz zobaczyć inne bazy danych, takie jak information_schema i performance_schema . Są tam do przechowywania metadanych tabeli.

 > use db_demo;

Następnie utwórz tabelę, która odzwierciedla listę z naszej aplikacji Flask. Wpisz poniższy kod w notatniku i wklej go w swojej chmurze:

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

Ten kod jest poleceniem SQL, które tworzy tabelę o nazwie songs , z czterema kolumnami ( song_id , title , artist i genre ). Poinstruowaliśmy również, że tabela powinna definiować song_id jako klucz podstawowy i automatycznie zwiększać od 1.

Teraz uruchom show tables; aby potwierdzić, że tabela została utworzona.

Ten obraz przedstawia dane wyjściowe powłoki, gdy uruchamiamy tabele show w powłoce chmury
Wyjście powłoki dla „pokazuj tabele” (duży podgląd)

I tak po prostu stworzyliśmy bazę danych i naszą tabelę songs .

Naszym kolejnym zadaniem jest skonfigurowanie Google App Engine, abyśmy mogli wdrożyć naszą aplikację.

Silnik Aplikacji Google

App Engine to w pełni zarządzana platforma do tworzenia i hostowania aplikacji internetowych na dużą skalę. Zaletą wdrożenia w App Engine jest możliwość automatycznego skalowania aplikacji w celu obsługi ruchu przychodzącego.

Witryna App Engine mówi:

„Dzięki zerowemu zarządzaniu serwerem i zerowym wdrożeniom konfiguracji programiści mogą skupić się tylko na tworzeniu doskonałych aplikacji bez narzutów na zarządzanie”.

Skonfiguruj silnik aplikacji

Istnieje kilka sposobów konfiguracji App Engine: za pomocą interfejsu użytkownika Google Cloud Console lub za pomocą Google Cloud SDK. W tej sekcji użyjemy SDK. Umożliwia nam wdrażanie, zarządzanie i monitorowanie naszej instancji Google Cloud z naszego komputera lokalnego.

Zainstaluj pakiet SDK Google Cloud

Postępuj zgodnie z instrukcjami, aby pobrać i zainstalować pakiet SDK dla komputerów Mac lub Windows. Poradnik pokaże Ci również, jak zainicjować SDK w swoim CLI i jak wybrać projekt Google Cloud.

Teraz, gdy pakiet SDK został zainstalowany, zaktualizujemy nasz skrypt Pythona o poświadczenia naszej bazy danych i wdrożymy go w App Engine.

Konfiguracja lokalna

W naszym lokalnym środowisku zamierzamy zaktualizować konfigurację, aby pasowała do naszej nowej architektury, która obejmuje Cloud SQL i App Engine.

Najpierw dodaj plik app.yaml do naszego folderu głównego. Jest to plik konfiguracyjny wymagany przez App Engine do hostowania i uruchamiania naszej aplikacji. Informuje App Engine o naszym środowisku wykonawczym i innych zmiennych, które mogą być wymagane. W przypadku naszej aplikacji będziemy musieli dodać poświadczenia naszej bazy danych jako zmienne środowiskowe, aby App Engine rozpoznał instancję naszej bazy danych.

W pliku app.yaml dodaj poniższy fragment kodu. Zmienne wykonawcze i zmienne bazy danych otrzymasz po skonfigurowaniu bazy danych. Zastąp wartości nazwą użytkownika, hasłem, nazwą bazy danych i nazwą połączenia, których użyłeś podczas konfigurowania 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

Teraz zainstalujemy PyMySQL. Jest to pakiet Python MySQL, który łączy i wykonuje zapytania w bazie danych MySQL. Zainstaluj pakiet PyMySQL, uruchamiając ten wiersz w swoim CLI:

 pip install pymysql

W tym momencie jesteśmy gotowi do użycia PyMySQL, aby połączyć się z naszą bazą danych Cloud SQL z poziomu aplikacji. Umożliwi nam to pobieranie i wstawianie zapytań do naszej bazy danych.

Zainicjuj złącze bazy danych

Najpierw utwórz plik db.py w naszym folderze głównym i dodaj poniższy kod:

 #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()

Zrobiliśmy tutaj kilka rzeczy.

Najpierw pobraliśmy poświadczenia naszej bazy danych z pliku app.yaml za pomocą metody os.environ.get . App Engine może udostępnić zmienne środowiskowe zdefiniowane w app.yaml w aplikacji.

Po drugie, stworzyliśmy funkcję open_connection . Łączy się z naszą bazą danych MySQL za pomocą poświadczeń.

Po trzecie, dodaliśmy dwie funkcje: get_songs i add_songs . Pierwsza inicjuje połączenie z bazą danych, wywołując funkcję open_connection . Następnie wysyła zapytanie do tabeli songs dla każdego wiersza i, jeśli jest pusta, zwraca „Brak utworów w DB”. Funkcja add_songs wstawia nowy rekord do tabeli songs .

W końcu wracamy do miejsca, w którym zaczęliśmy, naszego pliku main.py Teraz, zamiast pobierać nasze utwory z obiektu, jak to zrobiliśmy wcześniej, wywołujemy funkcję add_songs , aby wstawić rekord, i funkcję get_songs , aby pobrać rekordy z bazy danych.

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()

Zaimportowaliśmy funkcje get_songs i add_songs i wywołaliśmy je w naszej funkcji widoku Songs songs() . Jeśli wysyłamy żądanie post , wywołujemy funkcję add_songs , a jeśli wysyłamy żądanie get , wywołujemy funkcję get_songs .

I nasza aplikacja jest gotowa.

Następnym krokiem jest dodanie pliku requirements.txt . Ten plik zawiera listę pakietów niezbędnych do uruchomienia aplikacji. App Engine sprawdza ten plik i instaluje wymienione pakiety.

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

Ten wiersz pobiera dwa pakiety, których używamy dla aplikacji (Flask i requirements.txt ), tworzy plik Requirements.txt i dołącza pakiety i ich wersje do pliku.

W tym momencie dodaliśmy trzy nowe pliki: db.py , app.yaml i requirements.txt .

Wdróż w Google App Engine

Uruchom następujące polecenie, aby wdrożyć swoją aplikację:

 gcloud app deploy

Jeśli wszystko poszło dobrze, konsola wyświetli to:

Ten obraz przedstawia dane wyjściowe podczas wdrażania w App Engine
Dane wyjściowe CLI do wdrożenia App Engine (duży podgląd)

Twoja aplikacja działa teraz w App Engine. Aby zobaczyć go w przeglądarce, uruchom gcloud app browse w swoim CLI.

Możemy uruchomić Postmana, aby przetestować nasz post i get prośby.

Ten obraz przedstawia żądanie wysłania wiadomości do naszej wdrożonej aplikacji
Demonstracja prośby o wysłanie (duży podgląd)
Ten obraz przedstawia żądanie pobrania do naszej wdrożonej aplikacji
Demonstracja żądania get (duży podgląd)

Nasza aplikacja jest teraz hostowana w infrastrukturze Google i możemy dostosować konfigurację, aby uzyskać wszystkie korzyści architektury bezserwerowej. W przyszłości możesz oprzeć się na tym artykule, aby Twoja aplikacja bezserwerowa była bardziej niezawodna.

Wniosek

Korzystanie z infrastruktury platformy jako usługi (PaaS), takiej jak App Engine i Cloud SQL, zasadniczo oddziela poziom infrastruktury i umożliwia nam szybsze tworzenie. Jako programiści nie musimy się martwić konfiguracją, tworzeniem kopii zapasowych i przywracaniem, systemem operacyjnym, automatycznym skalowaniem, zaporami ogniowymi, migracją ruchu i tak dalej. Jeśli jednak potrzebujesz kontroli nad podstawową konfiguracją, lepiej użyć usługi zbudowanej na zamówienie.

Bibliografia

  • „Pobierz Pythona”
  • „venv — tworzenie środowisk wirtualnych”, Python (dokumentacja)
  • „Pobierz listonosz”
  • „Cloud SQL”, Google Cloud
  • Google Cloud
  • „Bezpłatna warstwa Google Cloud”, Google Cloud
  • „Tworzenie i zarządzanie projektami”, Google Cloud
  • „Przegląd VPC” (wirtualna chmura prywatna), Google Cloud
  • „App Engine”, Google Cloud
  • „Szybkie starty” (pobierz pakiet Google Cloud SDK), Google Cloud
  • Dokumentacja PyMySQL