Configurarea unui API folosind Flask, Google Cloud SQL și App Engine

Publicat: 2022-03-10
Rezumat rapid ↬ Flask face posibil ca dezvoltatorii să construiască un API pentru orice caz de utilizare pe care l-ar putea avea. În acest tutorial, vom învăța cum să configurați Google Cloud, Cloud SQL și App Engine pentru a construi un API Flask. (Cloud SQL este un motor de baze de date platform-as-a-service (PaaS) complet gestionat, iar App Engine este un PaaS complet gestionat pentru găzduirea aplicațiilor.)

Câteva cadre Python pot fi folosite pentru a crea API-uri, dintre care două sunt Flask și Django. Frameworks vine cu funcționalități care facilitează implementarea funcțiilor de care utilizatorii au nevoie pentru a interacționa cu aplicațiile lor. Complexitatea unei aplicații web poate fi un factor decisiv atunci când alegeți cu ce cadru să lucrați.

Django

Django este un cadru robust care are o structură predefinită cu funcționalitate încorporată. Dezavantajul robusteții sale este că ar putea face cadrul prea complex pentru anumite proiecte. Este cel mai potrivit pentru aplicațiile web complexe care trebuie să utilizeze funcționalitatea avansată a Django.

balon

Flask, pe de altă parte, este un cadru ușor pentru construirea de API-uri. Este ușor să începeți, iar pachetele sunt disponibile pentru a-l face robust pe măsură ce mergeți. Acest articol se va concentra pe definirea funcțiilor de vizualizare și a controlerului și pe conectarea la o bază de date pe Google Cloud și implementarea în Google Cloud.

În scopul învățării, vom construi un API Flask cu câteva puncte finale pentru a gestiona o colecție de melodii noastre preferate. Punctele finale vor fi pentru solicitările GET și POST : preluarea și crearea de resurse. Pe lângă aceasta, vom folosi suita de servicii pe platforma Google Cloud. Vom configura Cloud SQL de la Google pentru baza noastră de date și vom lansa aplicația noastră prin implementarea în App Engine. Acest tutorial se adresează începătorilor care fac prima încercare de a folosi Google Cloud pentru aplicația lor.

Configurarea unui proiect Flask

Acest tutorial presupune că aveți instalat Python 3.x. Dacă nu, mergeți pe site-ul oficial pentru a-l descărca și instala.

Pentru a verifica dacă Python este instalat, lansați interfața de linie de comandă (CLI) și executați comanda de mai jos:

 python -V

Primul nostru pas este să creăm directorul în care va locui proiectul nostru. O vom numi flask-app :

 mkdir flask-app && cd flask-app

Primul lucru de făcut atunci când porniți un proiect Python este să creați un mediu virtual. Mediile virtuale izolează dezvoltarea dvs. de lucru Python. Aceasta înseamnă că acest proiect poate avea propriile sale dependențe, diferite de alte proiecte de pe mașinile dvs. venv este un modul care este livrat cu Python 3.

Mai multe după săritură! Continuați să citiți mai jos ↓

Să creăm un mediu virtual în directorul nostru flask-app :

 python3 -m venv env

Această comandă creează un folder env în directorul nostru. Numele (în acest caz, env ) este un alias pentru mediul virtual și poate fi numit orice.

Acum că am creat mediul virtual, trebuie să spunem proiectului nostru să-l folosească. Pentru a activa mediul nostru virtual, utilizați următoarea comandă:

 source env/bin/activate

Veți vedea că promptul dvs. CLI are acum env la început, ceea ce indică faptul că mediul nostru este activ.

Afișează promptul env pentru a indica faptul că un mediu este activ
(env) apare înaintea solicitării (previzualizare mare)

Acum, să instalăm pachetul nostru Flask:

 pip install flask

Creați un director numit api în directorul nostru curent. Creăm acest director, astfel încât să avem un folder în care vor locui celelalte foldere ale aplicației noastre.

 mkdir api && cd api

Apoi, creați un fișier main.py , care va servi drept punct de intrare în aplicația noastră:

 touch main.py

Deschideți main.py și introduceți următorul cod:

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

Să înțelegem ce am făcut aici. Am importat mai întâi clasa Flask din pachetul Flask. Apoi, am creat o instanță a clasei și am atribuit-o app . Apoi, am creat primul nostru punct final, care indică rădăcina aplicației noastre. În rezumat, aceasta este o funcție de vizualizare care invocă ruta / - returnează Hello World .

Să rulăm aplicația:

 python main.py

Aceasta pornește serverul nostru local și deservește aplicația noastră pe https://127.0.0.1:5000/ . Introduceți adresa URL în browser și veți vedea răspunsul Hello World tipărit pe ecran.

Și voila! Aplicația noastră este în funcțiune. Următoarea sarcină este să-l faci funcțional.

Pentru a apela punctele noastre finale, vom folosi Postman, care este un serviciu care ajută dezvoltatorii să testeze punctele finale. Îl puteți descărca de pe site-ul oficial.

Să facem ca main.py să returneze câteva date:

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

Aici, am inclus o listă de melodii, inclusiv titlul melodiei și numele artistului. Apoi am schimbat rădăcina / ruta în /songs . Acest traseu returnează matricea de melodii pe care am specificat-o. Pentru a obține lista noastră ca valoare JSON, am JSONificat lista trecând-o prin jsonify . Acum, în loc să vedem o simplă Hello world , vedem o listă de artiști când accesăm punctul final https://127.0.0.1:5000/songs .

Această imagine arată răspunsul de la o solicitare de obținere
Un răspuns get la Postman (previzualizare mare)

Poate ați observat că, după fiecare modificare, a trebuit să ne repornim serverul. Pentru a activa reîncărcarea automată când codul se schimbă, să activăm opțiunea de depanare. Pentru a face acest lucru, schimbați app.run la aceasta:

 app.run(debug=True)

Apoi, să adăugăm o melodie folosind o solicitare de postare în matricea noastră. Mai întâi, importați obiectul de request , astfel încât să putem procesa cererea primită de la utilizatorii noștri. Mai târziu, vom folosi obiectul de request în funcția de vizualizare pentru a obține intrarea utilizatorului în 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)

Funcția noastră de vizualizare add_songs preia o melodie trimisă de utilizator și o adaugă la lista noastră existentă de melodii.

Această imagine demonstrează o solicitare de postare folosind Postman
Postați cererea de la poștaș (previzualizare mare)

Până acum, ne-am returnat datele dintr-o listă Python. Acesta este doar experimental, deoarece într-un mediu mai robust, datele noastre nou adăugate s-ar pierde dacă am reporni serverul. Acest lucru nu este fezabil, așa că vom avea nevoie de o bază de date live pentru a stoca și a prelua datele. Vine Cloud SQL.

De ce să folosiți o instanță Cloud SQL?

Conform site-ului oficial:

„Google Cloud SQL este un serviciu de baze de date complet gestionat, care facilitează configurarea, întreținerea, gestionarea și administrarea bazelor de date relaționale MySQL și PostgreSQL în cloud. Găzduit pe Google Cloud Platform, Cloud SQL oferă o infrastructură de baze de date pentru aplicațiile care rulează oriunde.”

Aceasta înseamnă că putem externaliza gestionarea infrastructurii unei baze de date în întregime către Google, la prețuri flexibile.

Diferența dintre Cloud SQL și un motor de calcul autogestionat

Pe Google Cloud, putem porni o mașină virtuală pe infrastructura Google Compute Engine și putem instala instanța noastră SQL. Aceasta înseamnă că vom fi responsabili pentru scalabilitatea verticală, replicare și o serie de alte configurații. Cu Cloud SQL, obținem o mulțime de configurații din cutie, astfel încât să putem petrece mai mult timp pe cod și mai puțin timp pentru configurare.

Înainte de a începe:

  1. Înscrieți-vă la Google Cloud. Google oferă credit gratuit de 300 USD noilor utilizatori.
  2. Creați un proiect. Acest lucru este destul de simplu și poate fi făcut chiar din consolă.

Creați o instanță Cloud SQL

După înregistrarea la Google Cloud, în panoul din stânga, derulați la fila „SQL” și faceți clic pe ea.

Această imagine arată o subsecțiune a serviciilor GCP
Instantaneu al serviciilor GCP (previzualizare mare)
Această imagine arată cele trei motoare de baze de date oferite pentru Cloud SQL
Pagina consolei Cloud SQL (previzualizare mare)

În primul rând, ni se cere să alegem un motor SQL. Vom merge cu MySQL pentru acest articol.

Această imagine arată pagina pentru crearea unei instanțe Cloud SQL
Crearea unei noi instanțe Cloud SQL (previzualizare mare)

În continuare, vom crea o instanță. În mod implicit, instanța noastră va fi creată în SUA, iar zona va fi selectată automat pentru noi.

Setați parola rădăcină și dați un nume instanței, apoi faceți clic pe butonul „Creați”. Puteți configura în continuare instanța făcând clic pe meniul drop-down „Afișați opțiunile de configurare”. Setările vă permit să configurați dimensiunea instanței, capacitatea de stocare, securitatea, disponibilitatea, backup-urile și multe altele. Pentru acest articol, vom merge cu setările implicite. Nu vă faceți griji, aceste variabile pot fi modificate ulterior.

Ar putea dura câteva minute pentru ca procesul să se termine. Veți ști că instanța este gata când vedeți o bifă verde. Faceți clic pe numele instanței dvs. pentru a accesa pagina cu detalii.

Acum, că suntem în funcțiune, vom face câteva lucruri:

  1. Creați o bază de date.
  2. Creați un utilizator nou.
  3. Lista albă cu adresa noastră IP.

Creați o bază de date

Navigați la fila „Bază de date” pentru a crea o bază de date.

Această imagine arată crearea unui nou utilizator pe Cloud SQL
Crearea unei noi baze de date pe Cloud SQL (previzualizare mare)

Creați un utilizator nou

Crearea unui utilizator nou pe Cloud SQL (previzualizare mare)

În secțiunea „Nume gazdă”, setați-o să permită „% (orice gazdă)”.

Adresa IP din lista albă

Vă puteți conecta la instanța bazei de date în unul din două moduri. O adresă IP privată necesită un cloud privat virtual (VPC). Dacă alegeți această opțiune, Google Cloud va crea un VPC gestionat de Google și va plasa instanța dvs. în el. Pentru acest articol, vom folosi adresa IP publică , care este implicită. Este public în sensul că numai persoanele ale căror adrese IP au fost trecute pe lista albă pot accesa baza de date.

Pentru a vă lista albă adresa IP, introduceți my ip într-o căutare Google pentru a obține IP-ul dvs. Apoi, accesați fila „Conexiuni” și „Adăugați rețea”.

Această imagine arată pagina pentru lista albă IP
Lista albă adresa dvs. IP (previzualizare mare)

Conectați-vă la instanță

Apoi, navigați la panoul „Prezentare generală” și conectați-vă folosind cloud shell.

Această imagine arată tabloul de bord Cloud SQL
Tabloul de bord Cloud SQL (previzualizare mare)

Comanda de conectare la instanța noastră Cloud SQL va fi pre-introdusă în consolă.

Puteți utiliza fie utilizatorul root, fie utilizatorul care a fost creat anterior. În comanda de mai jos, spunem: Conectați-vă la instanța flask-demo ca utilizator USERNAME . Vi se va solicita să introduceți parola utilizatorului.

 gcloud sql connect flask-demo --user=USERNAME

Dacă primiți o eroare care spune că nu aveți un ID de proiect, puteți obține ID-ul proiectului dvs. rulând acest lucru:

 gcloud projects list

Luați ID-ul proiectului care a fost scos din comanda de mai sus și introduceți-l în comanda de mai jos, înlocuind PROJECT_ID cu acesta.

 gcloud config set project PROJECT_ID

Apoi, rulați comanda gcloud sql connect și vom fi conectați.

Rulați această comandă pentru a vedea bazele de date active:

 > show databases; 
Această imagine arată rezultatul shell-ului pentru când rulăm bazele de date show în cloud shell
Ieșire Shell pentru „afișați bazele de date” (previzualizare mare)

Baza mea de date se numește db_demo și voi rula comanda de mai jos pentru a folosi baza de date db_demo . Este posibil să vedeți și alte baze de date, cum ar fi information_schema și performance_schema . Acestea sunt acolo pentru a stoca metadatele din tabel.

 > use db_demo;

Apoi, creați un tabel care să reflecte lista din aplicația noastră Flask. Introdu codul de mai jos pe un notepad și inserează-l în cloud shell:

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

Acest cod este o comandă SQL care creează un tabel numit songs , cu patru coloane ( song_id , title , artist și genre ). De asemenea, am instruit că tabelul ar trebui să definească song_id ca o cheie primară și să crească automat de la 1.

Acum, rulați show tables; pentru a confirma faptul că tabelul a fost creat.

Această imagine arată rezultatul shell-ului pentru când rulăm show tables în cloud shell
Ieșire Shell pentru „afișați tabelele” (previzualizare mare)

Și tocmai așa, am creat o bază de date și tabelul nostru de songs .

Următoarea noastră sarcină este să configuram Google App Engine, astfel încât să putem implementa aplicația noastră.

Google App Engine

App Engine este o platformă complet gestionată pentru dezvoltarea și găzduirea aplicațiilor web la scară. Un avantaj al implementării în App Engine este că permite unei aplicații să se extindă automat pentru a răspunde traficului de intrare.

Site-ul App Engine spune:

„Având zero management de server și zero implementări de configurare, dezvoltatorii se pot concentra doar pe construirea de aplicații grozave, fără costurile de gestionare.”

Configurați App Engine

Există câteva moduri de a configura App Engine: prin interfața de utilizare a Google Cloud Console sau prin Google Cloud SDK. Vom folosi SDK-ul pentru această secțiune. Ne permite să implementăm, să gestionăm și să monitorizăm instanța noastră Google Cloud de pe mașina noastră locală.

Instalați Google Cloud SDK

Urmați instrucțiunile pentru a descărca și instala SDK-ul pentru Mac sau Windows. Ghidul vă va arăta, de asemenea, cum să inițializați SDK-ul în CLI și cum să alegeți un proiect Google Cloud.

Acum că SDK-ul a fost instalat, vom actualiza scriptul nostru Python cu acreditările bazei de date și vom implementa în App Engine.

Configurare locală

În mediul nostru local, vom actualiza configurația pentru a se potrivi noii noastre arhitecturi, care include Cloud SQL și App Engine.

Mai întâi, adăugați un fișier app.yaml în folderul nostru rădăcină. Acesta este un fișier de configurare de care App Engine are nevoie pentru a găzdui și a rula aplicația noastră. Acesta spune App Engine despre timpul nostru de rulare și despre alte variabile care ar putea fi necesare. Pentru aplicația noastră, va trebui să adăugăm acreditările bazei de date ca variabile de mediu, astfel încât App Engine să fie conștient de instanța bazei de date.

În fișierul app.yaml , adăugați fragmentul de mai jos. Veți obține variabilele de rulare și de bază de date din configurarea bazei de date. Înlocuiți valorile cu numele de utilizator, parola, numele bazei de date și numele conexiunii pe care le-ați folosit la configurarea 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

Acum, vom instala PyMySQL. Acesta este un pachet Python MySQL care conectează și efectuează interogări într-o bază de date MySQL. Instalați pachetul PyMySQL rulând această linie în CLI:

 pip install pymysql

În acest moment, suntem gata să folosim PyMySQL pentru a ne conecta la baza noastră de date Cloud SQL din aplicație. Acest lucru ne va permite să obținem și să inserăm interogări în baza noastră de date.

Inițializați conectorul bazei de date

Mai întâi, creați un fișier db.py în folderul nostru rădăcină și adăugați codul de mai jos:

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

Am făcut câteva lucruri aici.

În primul rând, am preluat acreditările bazei de date din fișierul app.yaml folosind metoda os.environ.get . App Engine este capabil să facă disponibile în aplicație variabilele de mediu care sunt definite în app.yaml .

În al doilea rând, am creat o funcție open_connection . Se conectează la baza noastră de date MySQL cu acreditările.

În al treilea rând, am adăugat două funcții: get_songs și add_songs . Primul inițiază o conexiune la baza de date apelând funcția open_connection . Apoi interogează tabelul de songs pentru fiecare rând și, dacă este gol, returnează „Fără melodii în DB”. Funcția add_songs inserează o înregistrare nouă în tabelul de songs .

În cele din urmă, ne întoarcem de unde am început, fișierul nostru main.py Acum, în loc să ne obținem melodiile dintr-un obiect, așa cum am făcut mai devreme, apelăm funcția add_songs pentru a insera o înregistrare și apelăm funcția get_songs pentru a prelua înregistrările din baza de date.

Să refactorăm 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()

Am importat funcțiile get_songs și add_songs și le-am numit în funcția noastră de vizualizare songs() . Dacă facem o cerere de post , apelăm funcția add_songs , iar dacă facem o solicitare get , apelăm funcția get_songs .

Și aplicația noastră este gata.

Următorul este adăugarea unui fișier requirements.txt . Acest fișier conține o listă de pachete necesare pentru a rula aplicația. App Engine verifică acest fișier și instalează pachetele enumerate.

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

Această linie primește cele două pachete pe care le folosim pentru aplicație (Flask și PyMySQL), creează un fișier requirements.txt și adaugă pachetele și versiunile acestora la fișier.

În acest moment, am adăugat trei fișiere noi: db.py , app.yaml și requirements.txt .

Implementați în Google App Engine

Rulați următoarea comandă pentru a vă implementa aplicația:

 gcloud app deploy

Dacă a mers bine, consola dvs. va scoate următoarele:

Această imagine arată rezultatul la implementarea în App Engine
Ieșire CLI pentru implementarea App Engine (previzualizare mare)

Aplicația dvs. rulează acum pe App Engine. Pentru a-l vedea în browser, rulați gcloud app browse în CLI.

Putem lansa Postman pentru a ne testa post și get solicitări.

Această imagine demonstrează o solicitare de postare către aplicația noastră implementată
Demonstrarea unei solicitări de postare (previzualizare mare)
Această imagine demonstrează o solicitare de obținere către aplicația noastră implementată
Demonstrarea unei cereri de get (previzualizare mare)

Aplicația noastră este acum găzduită în infrastructura Google și putem modifica configurația pentru a obține toate beneficiile unei arhitecturi fără server. În continuare, puteți să vă bazați pe acest articol pentru a vă face aplicația fără server mai robustă.

Concluzie

Utilizarea unei infrastructuri platform-as-a-service (PaaS) cum ar fi App Engine și Cloud SQL, practic, reduce nivelul de infrastructură și ne permite să construim mai rapid. În calitate de dezvoltatori, nu trebuie să ne facem griji cu privire la configurare, backup și restaurare, sistemul de operare, auto-scaling, firewall-uri, migrarea traficului și așa mai departe. Cu toate acestea, dacă aveți nevoie de control asupra configurației de bază, atunci ar putea fi mai bine să utilizați un serviciu personalizat.

Referințe

  • „Descărcați Python”
  • „venv — Crearea de medii virtuale”, Python (documentație)
  • „Descărcați Poștașul”
  • „Cloud SQL”, Google Cloud
  • Google Cloud
  • „Google Cloud Free Tier”, Google Cloud
  • „Crearea și gestionarea proiectelor”, Google Cloud
  • „Prezentare generală VPC” (clorul privat virtual), Google Cloud
  • „App Engine”, Google Cloud
  • „Quickstarts” (descărcați Google Cloud SDK), Google Cloud
  • Documentația PyMySQL