
如何快速實(shí)現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
現(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)題的列表。
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)有的歌曲列表中。
到目前為止,我們都是從 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 的用武之地。
根據(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à)策略。
在 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)備工作:
注冊(cè) Google Cloud 后,在左側(cè)面板中,滾動(dòng)到“SQL”選項(xiàng)卡并單擊它。
首先,我們需要選擇一個(gè) SQL 引擎。在本文中,我們將使用 MySQL。
接下來,我們將創(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ù):
導(dǎo)航到 “Database” 選項(xiàng)卡以創(chuàng)建數(shù)據(jù)庫。
在 “Host name” 部分中,將其設(shè)置為允許 “% (any host)”。
要連接到數(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ù)庫的白名單中。
接下來,導(dǎo)航到“概述”面板并使用 Cloud Shell 進(jìn)行連接。
控制臺(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ù)庫名為db_demo
,我將運(yùn)行下面的命令來使用db_demo
數(shù)據(jù)庫。您可能會(huì)看到其他一些數(shù)據(jù)庫,例如information_schema
和performance_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_id
、title
、artist
和genre
)。我們還指示表應(yīng)該將song_id
定義為主鍵,并從1自動(dòng)遞增。
現(xiàn)在,運(yùn)行show tables;
以確認(rèn)表已創(chuàng)建。
就這樣,我們已經(jīng)成功創(chuàng)建了一個(gè)數(shù)據(jù)庫以及名為 songs
的表。
接下來,我們的任務(wù)是配置 Google App Engine,以便能夠部署我們的應(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ù)分心。”
配置 App Engine 可以通過 Google Cloud Console 的用戶界面完成,也可以通過 Google Cloud SDK 實(shí)現(xiàn)。在本節(jié)中,我們將采用 SDK 的方式。SDK 允許我們從本地計(jì)算機(jī)上部署、管理和監(jiān)控 Google Cloud 實(shí)例。
請(qǐng)按照提供的指南下載并安裝適用于 Mac 或 Windows 的 SDK。安裝完成后,您需要在命令行界面中初始化 SDK,并選擇要操作的 Google Cloud 項(xiàng)目。
現(xiàn)在,SDK 已經(jīng)準(zhǔn)備就緒,接下來我們將更新 Python 腳本,添加數(shù)據(jù)庫憑證,并將應(yīng)用程序部署到 App Engine。
為了適應(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ù)庫中獲取和插入查詢。
首先,在我們的根文件夾中創(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_songs
。get_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.py
、app.yaml
和 requirements.txt
。
執(zhí)行以下命令,部署您的應(yīng)用。
gcloud app deploy
如果運(yùn)行順利,您的控制臺(tái)將輸出以下內(nèi)容:
您的應(yīng)用現(xiàn)在正在App Engine上運(yùn)行。要在瀏覽器中查看它,請(qǐng)?jiān)贑LI中運(yùn)行gcloud app browse
。
我們可以啟動(dòng)Postman來測試我們的post
和get
請(qǐng)求。
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)用程序的健壯性。
借助 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/
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)