現(xiàn)在,讓我們安裝我們的 Flask 包:

pip install flask

在當(dāng)前目錄中,我們需要?jiǎng)?chuàng)建一個(gè)名為 api 的文件夾。創(chuàng)建這個(gè)文件夾的目的是為了容納我們的應(yīng)用程序的其他子文件夾和文件。

mkdir api && cd api

接下來,創(chuàng)建一個(gè)main.py文件,它將作為我們應(yīng)用程序的入口點(diǎn):

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 包中導(dǎo)入了 Flask 類。接著,我們創(chuàng)建了這個(gè)類的一個(gè)實(shí)例,并將其賦值給變量?app。隨后,我們定義了第一個(gè)端點(diǎn),它對(duì)應(yīng)于應(yīng)用的根路徑。簡而言之,這個(gè)端點(diǎn)是一個(gè)視圖函數(shù),當(dāng)用戶訪問根路徑時(shí)會(huì)調(diào)用它,并返回 “Hello World” 的響應(yīng)。

讓我們運(yùn)行應(yīng)用程序:

python main.py

這將啟動(dòng)我們的本地服務(wù)器,它會(huì)在 https://127.0.0.1:5000/ 上為我們的 Flask 應(yīng)用程序提供服務(wù)。只需在瀏覽器中輸入這個(gè) URL,您就能在屏幕上看到 “Hello World” 的響應(yīng)。

看!我們的 Flask 應(yīng)用程序已經(jīng)成功啟動(dòng)并運(yùn)行了。接下來,我們的任務(wù)是確保它能夠正常工作,并進(jìn)行一些擴(kuò)展。

為了測試和調(diào)用我們的 API 端點(diǎn),我們將使用 Postman,這是一個(gè)專為開發(fā)人員設(shè)計(jì)的用于測試 API 端點(diǎn)的服務(wù)。您可以從 Postman 的官方網(wǎng)站下載并安裝它。

現(xiàn)在,讓我們修改 main.py 文件,讓它返回一些實(shí)際的數(shù)據(jù),而不僅僅是 “Hello World”。

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

在這里,我們定義了一個(gè)包含歌曲列表的數(shù)組,每首歌曲都有標(biāo)題和藝術(shù)家名字。接著,我們將根路由 / 更改為 /songs。這個(gè)新的路由會(huì)返回我們指定的歌曲數(shù)組。為了將列表以 JSON 格式返回,我們使用了 jsonify 函數(shù)來轉(zhuǎn)換列表。現(xiàn)在,當(dāng)我們?cè)L問 https://127.0.0.1:5000/songs 時(shí),不再看到簡單的 “Hello World” 響應(yīng),而是會(huì)看到包含藝術(shù)家和歌曲標(biāo)題的列表。

Postman的get回應(yīng)(大預(yù)覽)

您可能已經(jīng)注意到,在每次對(duì)代碼進(jìn)行更改后,都需要手動(dòng)重新啟動(dòng)服務(wù)器才能看到效果。為了能夠在代碼更改時(shí)自動(dòng)重新加載服務(wù)器,我們可以啟用 Flask 的 debug 選項(xiàng)。要實(shí)現(xiàn)這一點(diǎn),只需將 app.run() 調(diào)用修改為包含 debug=True 參數(shù),如下所示:

app.run(debug=True)

接下來,讓我們使用post請(qǐng)求向數(shù)組中添加一首歌曲。首先,導(dǎo)入request對(duì)象,這樣我們就可以處理來自用戶的傳入請(qǐng)求。稍后我們將在view函數(shù)中使用request對(duì)象來獲取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 view函數(shù)接受用戶提交的歌曲,并將其添加到現(xiàn)有的歌曲列表中。

post帖子請(qǐng)求(大預(yù)覽)

到目前為止,我們都是從 Python 列表中返回?cái)?shù)據(jù)的,但這只是實(shí)驗(yàn)性的做法,因?yàn)樵诟鼘?shí)際的應(yīng)用場景中,如果我們重新啟動(dòng)服務(wù)器,之前添加的數(shù)據(jù)就會(huì)丟失,這顯然是不可行的,因此,我們需要一個(gè)實(shí)時(shí)的數(shù)據(jù)庫來存儲(chǔ)和檢索數(shù)據(jù),這就是 Cloud SQL 的用武之地。

為什么要使用 Cloud SQL 實(shí)例?

根據(jù) Google 官方網(wǎng)站的介紹:

Google Cloud SQL 是一項(xiàng)完全托管的數(shù)據(jù)庫服務(wù),能夠輕松地在云中設(shè)置、維護(hù)、管理和操作關(guān)系型 MySQL 和 PostgreSQL 數(shù)據(jù)庫。Cloud SQL 托管在 Google Cloud Platform 上,為在任何位置運(yùn)行的應(yīng)用程序提供數(shù)據(jù)庫基礎(chǔ)架構(gòu)支持。

這意味著我們可以將數(shù)據(jù)庫基礎(chǔ)設(shè)施的管理完全外包給 Google,同時(shí)享受靈活的定價(jià)策略。

Cloud SQL 和自我管理的計(jì)算引擎之間的區(qū)別

Google Cloud 上,我們可以在 Compute Engine 基礎(chǔ)設(shè)施上啟動(dòng)虛擬機(jī),并在其上安裝 SQL 實(shí)例。但這樣做的話,我們就需要負(fù)責(zé)垂直可擴(kuò)展性、復(fù)制以及許多其他配置工作。而使用 Cloud SQL,我們可以獲得大量開箱即用的配置,從而能夠?qū)⒏鄷r(shí)間花在編寫代碼上,減少設(shè)置和配置的時(shí)間。

在我們開始使用 Cloud SQL 之前,需要先完成以下準(zhǔn)備工作:

  1. 注冊(cè) Google Cloud 賬號(hào)。Google 會(huì)為新用戶提供 300 美元的免費(fèi)積分。
  2. 在 Google Cloud 控制臺(tái)中創(chuàng)建一個(gè)新項(xiàng)目。這個(gè)過程非常簡單,可以直接通過控制臺(tái)完成。

創(chuàng)建 Cloud SQL 實(shí)例

注冊(cè) Google Cloud 后,在左側(cè)面板中,滾動(dòng)到“SQL”選項(xiàng)卡并單擊它。

GCP服務(wù)快照(大預(yù)覽)
Cloud SQL的控制臺(tái)頁面(大預(yù)覽)

首先,我們需要選擇一個(gè) SQL 引擎。在本文中,我們將使用 MySQL。

創(chuàng)建新的Cloud SQL實(shí)例(大預(yù)覽)

接下來,我們將創(chuàng)建一個(gè) Cloud SQL 實(shí)例。默認(rèn)情況下,實(shí)例將在美國創(chuàng)建,并且區(qū)域會(huì)自動(dòng)為我們選擇。

在設(shè)置過程中,我們需要為實(shí)例設(shè)置 root 密碼并命名,然后點(diǎn)擊“創(chuàng)建”按鈕。如果想要進(jìn)一步自定義實(shí)例的配置,可以點(diǎn)擊“顯示配置選項(xiàng)”下拉列表。這些設(shè)置允許我們調(diào)整實(shí)例的大小、存儲(chǔ)容量、安全性、可用性、備份等參數(shù)。不過,在本文中,我們將使用默認(rèn)設(shè)置來簡化流程。請(qǐng)放心,這些設(shè)置在未來是可以更改的。

實(shí)例的創(chuàng)建過程可能需要幾分鐘時(shí)間。當(dāng)看到綠色的對(duì)勾標(biāo)記時(shí),就意味著實(shí)例已經(jīng)準(zhǔn)備就緒。此時(shí),可以點(diǎn)擊實(shí)例的名稱進(jìn)入詳細(xì)信息頁面。

現(xiàn)在,我們的 Cloud SQL 實(shí)例已經(jīng)啟動(dòng)并運(yùn)行,接下來我們需要完成以下任務(wù):

  1. 創(chuàng)建一個(gè)數(shù)據(jù)庫。
  2. 創(chuàng)建一個(gè)新用戶。
  3. 將我們的 IP 地址添加到白名單中。

創(chuàng)建數(shù)據(jù)庫

導(dǎo)航到 “Database” 選項(xiàng)卡以創(chuàng)建數(shù)據(jù)庫。

在Cloud SQL上創(chuàng)建新數(shù)據(jù)庫(大預(yù)覽)

創(chuàng)建新用戶

在Cloud SQL上創(chuàng)建新用戶(大預(yù)覽)

在 “Host name” 部分中,將其設(shè)置為允許 “% (any host)”。

將 IP 地址列入白名單

要連接到數(shù)據(jù)庫實(shí)例,您可以選擇使用私有 IP 地址或公共 IP 地址。使用私有 IP 地址需要配置 Virtual Private Cloud(VPC)。在本文中,我們選擇使用公共 IP 地址,因?yàn)檫@是默認(rèn)選項(xiàng)且更為簡便。盡管公共 IP 地址是公開的,但只有那些 IP 地址已被列入白名單的用戶才能訪問數(shù)據(jù)庫,從而確保了安全性。

要將您的 IP 地址添加到白名單中,請(qǐng)首先在搜索引擎中輸入“my ip”以獲取您的當(dāng)前 IP 地址。然后,在 Cloud SQL 控制臺(tái)中,轉(zhuǎn)到“連接”選項(xiàng)卡,并選擇“添加網(wǎng)絡(luò)”。在出現(xiàn)的窗口中,輸入您剛才獲取的 IP 地址,以便將其添加到允許訪問數(shù)據(jù)庫的白名單中。

白名單您的IP地址(大預(yù)覽)

連接到實(shí)例

接下來,導(dǎo)航到“概述”面板并使用 Cloud Shell 進(jìn)行連接。

云SQL儀表板(大預(yù)覽)

控制臺(tái)中會(huì)預(yù)先提供用于連接到 Cloud SQL 實(shí)例的命令。

您可以選擇使用 root 用戶或之前創(chuàng)建的其他用戶進(jìn)行連接。以下命令示例展示了如何以用戶 flask-demo 的身份連接到名為 USERNAME 的實(shí)例(請(qǐng)將 USERNAME 替換為實(shí)際的實(shí)例名):

系統(tǒng)會(huì)提示您輸入該用戶的密碼以完成連接。

gcloud sql connect flask-demo --user=USERNAME

如果您收到一條錯(cuò)誤消息,指出您沒有項(xiàng)目 ID,您可以通過運(yùn)行以下命令來獲取項(xiàng)目的 ID:

gcloud projects list

取上面命令輸出的項(xiàng)目ID,并將其輸入到下面的命令中,將PROJECT_ID替換為它。

gcloud config set project PROJECT_ID

然后,運(yùn)行gcloud sql connect命令,我們將連接。

運(yùn)行以下命令以查看活動(dòng)數(shù)據(jù)庫:

> show databases;

“顯示數(shù)據(jù)庫”的Shell輸出(大預(yù)覽)

我的數(shù)據(jù)庫名為db_demo,我將運(yùn)行下面的命令來使用db_demo數(shù)據(jù)庫。您可能會(huì)看到其他一些數(shù)據(jù)庫,例如information_schemaperformance_schema。它們用于存儲(chǔ)表Meta數(shù)據(jù)。

> use db_demo;

接下來,創(chuàng)建一個(gè)表,該表鏡像 Flask 應(yīng)用程序中的列表。在記事本上鍵入以下代碼并將其粘貼到 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)
);

這段代碼是一個(gè)SQL命令,它創(chuàng)建了一個(gè)名為songs的表,其中有四列(song_idtitleartistgenre)。我們還指示表應(yīng)該將song_id定義為主鍵,并從1自動(dòng)遞增。

現(xiàn)在,運(yùn)行show tables;以確認(rèn)表已創(chuàng)建。


“show tables”的Shell輸出(大預(yù)覽)

就這樣,我們已經(jīng)成功創(chuàng)建了一個(gè)數(shù)據(jù)庫以及名為 songs 的表。

接下來,我們的任務(wù)是配置 Google App Engine,以便能夠部署我們的應(yīng)用程序。

Google 應(yīng)用引擎

App Engine 是一個(gè)全面托管的平臺(tái),專為大規(guī)模開發(fā)和托管 Web 應(yīng)用程序而設(shè)計(jì)。它的一大優(yōu)勢在于能夠自動(dòng)擴(kuò)展應(yīng)用程序以滿足不斷變化的流量需求。

App Engine 官網(wǎng)介紹道:

“借助零服務(wù)器管理和零配置部署,開發(fā)人員可以全身心地投入到構(gòu)建卓越的應(yīng)用程序中,而無需為管理事務(wù)分心。”

設(shè)置 App Engine

配置 App Engine 可以通過 Google Cloud Console 的用戶界面完成,也可以通過 Google Cloud SDK 實(shí)現(xiàn)。在本節(jié)中,我們將采用 SDK 的方式。SDK 允許我們從本地計(jì)算機(jī)上部署、管理和監(jiān)控 Google Cloud 實(shí)例。

安裝 Google Cloud SDK

請(qǐng)按照提供的指南下載并安裝適用于 Mac 或 Windows 的 SDK。安裝完成后,您需要在命令行界面中初始化 SDK,并選擇要操作的 Google Cloud 項(xiàng)目。

現(xiàn)在,SDK 已經(jīng)準(zhǔn)備就緒,接下來我們將更新 Python 腳本,添加數(shù)據(jù)庫憑證,并將應(yīng)用程序部署到 App Engine。

本地設(shè)置

為了適應(yīng)新的架構(gòu)(包括 Cloud SQL 和 App Engine),我們需要在本地環(huán)境中進(jìn)行相應(yīng)的設(shè)置更新。

首先,我們需要在項(xiàng)目的根文件夾中添加一個(gè)名為 app.yaml 的文件。這是 App Engine 托管和運(yùn)行應(yīng)用程序所必需的配置文件。它包含了 App Engine 運(yùn)行應(yīng)用程序所需的運(yùn)行時(shí)環(huán)境和其他變量信息。對(duì)于我們的應(yīng)用程序,我們需要將數(shù)據(jù)庫憑證作為環(huán)境變量添加到 app.yaml 文件中,以便 App Engine 能夠識(shí)別并連接到我們的數(shù)據(jù)庫實(shí)例。

在 app.yaml 文件中,添加以下代碼片段。您需要根據(jù)在設(shè)置 Cloud SQL 時(shí)獲取的信息,替換運(yùn)行時(shí)環(huán)境和數(shù)據(jù)庫變量的值,包括用戶名、密碼、數(shù)據(jù)庫名稱和連接名稱。

#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

現(xiàn)在,我們將安裝 PyMySQL。這是一個(gè) Python MySQL 包,用于連接 MySQL 數(shù)據(jù)庫并對(duì)其執(zhí)行查詢。通過在 CLI 中運(yùn)行以下行來安裝 PyMySQL 軟件包:

pip install pymysql

此時(shí),我們已準(zhǔn)備好使用 PyMySQL 從應(yīng)用程序連接到我們的 Cloud SQL 數(shù)據(jù)庫。這將使我們能夠在數(shù)據(jù)庫中獲取和插入查詢。

初始化數(shù)據(jù)庫連接器

首先,在我們的根文件夾中創(chuàng)建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()

我們?cè)谶@里完成了幾個(gè)關(guān)鍵步驟來集成 Google App Engine 和 Cloud SQL。

首先,我們利用 app.yaml 文件從 os.environ.get 方法中檢索數(shù)據(jù)庫憑證。App Engine 能夠使 app.yaml 中定義的環(huán)境變量在應(yīng)用程序代碼中輕松可用。

其次,我們創(chuàng)建了一個(gè)名為 open_connection 的函數(shù),它使用這些憑證來建立與 MySQL 數(shù)據(jù)庫的連接。

接著,我們添加了兩個(gè)重要的函數(shù):get_songs 和 add_songsget_songs 函數(shù)通過調(diào)用 open_connection 函數(shù)來建立數(shù)據(jù)庫連接,并查詢 songs 表。如果表中沒有記錄,則返回“No Songs in DB”的消息。而 add_songs 函數(shù)則負(fù)責(zé)在 songs 表中插入新的記錄。

最后,我們回到 main.py 文件,對(duì)代碼進(jìn)行了重構(gòu)。現(xiàn)在,我們調(diào)用 add_songs 函數(shù)來插入新的歌曲記錄,并調(diào)用 get_songs 函數(shù)從數(shù)據(jù)庫中檢索歌曲記錄,而不是像之前那樣從某個(gè)對(duì)象中獲取歌曲數(shù)據(jù)。

現(xiàn)在,讓我們來重構(gòu) main.py 文件,以確保它能夠正確地與數(shù)據(jù)庫進(jìn)行交互。

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

我們導(dǎo)入了 get_songs 和 add_songs 函數(shù),并在 songs() 視圖函數(shù)中根據(jù)請(qǐng)求類型分別調(diào)用它們。當(dāng)接收到 POST 請(qǐng)求時(shí),我們調(diào)用 add_songs 函數(shù);當(dāng)接收到 GET 請(qǐng)求時(shí),我們調(diào)用 get_songs 函數(shù)。

至此,我們的應(yīng)用程序已經(jīng)開發(fā)完成。

接下來,我們需要添加 requirements.txt 文件。這個(gè)文件列出了運(yùn)行應(yīng)用程序所必需的所有程序包。App Engine 會(huì)自動(dòng)檢查這個(gè)文件,并安裝其中列出的所有程序包,以確保應(yīng)用程序能夠順利運(yùn)行。

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

為了獲取應(yīng)用程序中使用的 Flask 和 PyMySQL 這兩個(gè)包及其版本信息,我們創(chuàng)建了一個(gè) requirements.txt 文件,并將這些信息追加到了該文件中。

至此,我們已經(jīng)成功添加了三個(gè)新文件:db.pyapp.yaml 和 requirements.txt

部署到 Google App Engine

執(zhí)行以下命令,部署您的應(yīng)用。

gcloud app deploy

如果運(yùn)行順利,您的控制臺(tái)將輸出以下內(nèi)容:

App Engine部署的CLI輸出(大預(yù)覽)

您的應(yīng)用現(xiàn)在正在App Engine上運(yùn)行。要在瀏覽器中查看它,請(qǐng)?jiān)贑LI中運(yùn)行gcloud app browse

我們可以啟動(dòng)Postman來測試我們的postget請(qǐng)求。

演示post請(qǐng)求(大預(yù)覽)
演示get請(qǐng)求(大預(yù)覽)

我們的應(yīng)用程序現(xiàn)已托管在 Google 的基礎(chǔ)設(shè)施之上,能夠充分利用無服務(wù)器架構(gòu)所帶來的各種優(yōu)勢,只需通過調(diào)整配置即可實(shí)現(xiàn)。展望未來,您可以基于本文的內(nèi)容,進(jìn)一步增強(qiáng)無服務(wù)器應(yīng)用程序的健壯性。

結(jié)論

借助 App Engine 和 Cloud SQL 等平臺(tái)即服務(wù)(PaaS)基礎(chǔ)設(shè)施,我們得以從底層架構(gòu)的繁瑣事務(wù)中抽身,從而更專注于應(yīng)用的快速構(gòu)建。作為開發(fā)人員,我們無需再為配置管理、備份恢復(fù)、操作系統(tǒng)維護(hù)、自動(dòng)擴(kuò)展、防火墻設(shè)置以及流量遷移等事項(xiàng)而費(fèi)心。當(dāng)然,如果您對(duì)底層配置有著更為精細(xì)的控制需求,那么自定義構(gòu)建的服務(wù)可能會(huì)是更好的選擇。

原文鏈接:https://www.smashingmagazine.com/2020/08/api-flask-google-cloudsql-app-engine/

上一篇:

Spring Boot中API集成的多種方法

下一篇:

使用Gin在Go中實(shí)現(xiàn)RESTful HTTP API
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)