如何使用 NoSQL 數據庫搭建快速的 API 應用

介紹

當開發Python應用程式時,FastAPI是一個建造高性能解決方案的頂尖選擇。它提供了快速的效能、簡單易用的特點,以及對異步程式設計的支持,使其成為開發現代可擴展應用程式的理想選擇。
在這個教程中,我們將引導您完成設定一個與NoSQL数据库搭配的FastAPI應用程式的過程。對於存儲和管理數據來說,NoSQL数据库提供了靈活性和可擴展性,使它們成為需要處理多樣且複雜數據結構的應用程式的最佳選擇。

前提

在開始之前,您需要確保您已經準備好以下內容:

  • 一台運行Ubuntu的伺服器,以及一個具有sudo權限的非root用戶和一個活躍的防火牆。如需指導如何設定,請從這個列表中選擇您的的分發版,並遵循我們的初始伺服器設定指南。請確保使用受支持的版本的Ubuntu。

  • 熟悉 Linux 命令行。若要了解或重温命令行的基础知识,您可以閱讀此篇關於 Linux 命令行初学者指南 的文章。

  • 在 Ubuntu 終端機中運行 sudo apt-get update,以確保系統已經有最新版本及安全性更新,這些更新來自於您系統上配置的存儲庫中的軟體。

這些指示僅適用於最新的 Ubuntu 版本:Ubuntu 24.04、Ubuntu 22.04 和 Ubuntu 20.04。如果您正在使用 Ubuntu 版本 <= 18.04,我們建議您升至更新的版本,因為 Ubuntu 不再為這些版本提供支持。這份指南將幫助您升级 Ubuntu 版本。

步驟 1 – 在您的電腦上設定 Python 環境

在這個教學中,我們將使用 python3 套件來執行命令。最新的 Ubuntu 版本已經 Include Python 3 installation,所以要檢查其安裝,請運行以下命令:

python3 --version

如果這返回錯誤,您可以運行以下命令來安裝/重新安裝套件:

sudo apt-get install python3

接下來,您需要 install the pip 套件以安裝 Python 套件及其依賴,並以安全的方式進行。

sudo apt-get install python3-pip

步驟 2 – 建立虛擬環境

如果您正在使用 Ubuntu 版本 < 24.04,您不需要建立虛擬環境,但隔離您项目的依賴是一個好習慣。

從 Python 3.11 和 pip 22.3 開始,有一個新的 PEP 668 指出了將 Python 基礎環境標記為「外部管理」的规定,這意味著除非您在虛擬環境內工作,否則您將無法使用 pip 成功地安裝套件。

在這個步驟中,您將為您的項目創建一個虛擬環境,該環境將隔離您項目的依賴關係,以避免不同套件版本之間潛在的衝突。在終端機中運行以下命令集:

sudo apt-get install python3-venv

這將安裝創建虛擬環境所需的必要 venv 套件。

python3 -m venv fastapi-env

此命令将在您的工作目錄內創建一個名稱為 fastapi-env 的虛擬環境。要開始在此環境內工作,您需要激活它。

source fastapi-env/bin/activate

成功執行後,您將看到終端機提示符前面有这样的前缀:

(fastapi-env) user@machine:~$

現在,您可以開始在此虛擬環境內安裝所需的依賴。

步驟 3 – 安装必要的庫和套件

在這個步驟中,您將安裝幾個必要的套件和庫,這些是成功跟從本教程所需要的。

我們先安裝 fastapi,這是建立 FastAPI 應用程式的必要套件,以及 uvicorn,這是運行 FastAPI 應用程式的必要套件。

pip install fastapi uvicorn

在這個教學中,我們將使用 MongoDB 作為 NoSQL 資料庫。為了從 FastAPI 內與 MongoDB 互動,您需要安裝 motor,這是 MongoDB 的一個異步 Python 驅動程式。

pip install motor

步驟 4 – 在 Ubuntu 上安裝和設定 MongoDB

要在您的 Ubuntu 系統上安裝 MongoDB,請在終端機中執行以下命令集合:

wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

執行成功後,這將回傳 echo 參數。接下來, quickly 進行以下操作:

sudo apt-get update

這將確保在設定 MongoDB 金鑰後取得最新的更新。

接下來,您需要在系統上安裝一個 openssl 依賴,這是 MongoDB 安裝的必要條件。

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

執行後,系統會要求您重新啟動服務。重启後,使用以下命令安裝 MongoDB:

sudo apt-get install -y mongodb

啟動並啟用 MongoDB 服務:

sudo systemctl start mongod
sudo systemctl enable mongod

您可以通過執行以下命令來檢查 MongoDB 服務狀態並測試連接:

sudo systemctl status mongod
mongo --eval 'db.runCommand({connectionStatus: 1})'

步驟 5 – 創建 FastAPI 應用程式

接下來的步驟是創建一個 FastAPI 應用程式。在您的工作目錄中,創建一個 database.py 文件:

nano database.py

這會開啟一個空的文字編輯器。在這裡寫下您的數據庫連接邏輯。

database.py
from motor.motor_asyncio import AsyncIOMotorClient

MONGO_DETAILS = "mongodb://localhost:27017"

client = AsyncIOMotorClient(MONGO_DETAILS)

db = client.mydatabase

collection = db.mycollection

假設 mycollection of mydatabase 已經有了一些數據,現在您創建一個 main.py 文件,該文件包含了您的應用程式的邏輯。在以下的 FastAPI 應用中,使用 database.py 建立了數據庫連接,並定義了用於 AI 預測的路由。透過這些路由,輸入被驗證。

nano main.py

在文字編輯器中,寫下邏輯:

main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sklearn.linear_model import LinearRegression
import numpy as np
from database import collection

app = FastAPI()

# 簡單的數據集和模型
x = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])

model = LinearRegressions()
model.fit(x, y)

# 定義 Pydantic 模型用於輸入驗證
class InputData(BaseModel):
  feature: float

# route_1 用於根據輸入特徵預測輸出
@app.post("/predict/")
async def predict(input_data: InputData):
  try:
    prediction = model.predict([[input_data.feature]])
    return {"prediction": prediction[0]}
  except Exception as ex:
    raise HTTPException(status_code=400, detail=str(ex))

# route_2 來與 MongoDB 互動
@app.get("/items/")
async def get_item():
  items = []
  async for item in collection.find():
    items.append(item)
  return items

# route_3 來向 MongoDB 新增一個項目
@app.post("/items/")
async def create_item(item: dict):
  new_item = await collection.insert_one(item)
  created_item = await collection.fine_one({"_id": new_item.inserted_id})
  return created_item

以下是這個應用程式所做的 breakdown:

  • 從 sklearn 取得的線性回歸模型:這個模型根據一個輸入特徵來預測輸出。
  • InputData 從 Pydantic Model 來: 這定義了預測端點预期的輸入結構。在這個情況中,它是 float
  • MongoDB 路由: 路由 /items/POST /items/ 允許您從您的 MongoDB 收集中考量和插入項目。

步驟 6 – 運行 FastAPI 應用程序

要成功地運行這個應用程序,您需要安裝應用程序中使用的庫和包。

pip install pydantic scikit-learn numpy

現在,使用以下命令來運行這個應用程序:

uvicorn main:app --reload

這個命令的輸出將是:

Output
INFO: Will watch for changes in these directories: ['/path/to/your/project'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [XXXXX] using statreload INFO: Started server process [XXXXX] INFO: Waiting for application startup. INFO: Application startup complete.

FastAPI 自動生成了使用 Swagger UI 的互動式 API 文档。您可以通過訪問 http://127.0.0.1:8000/docs 來獲得它。

您可以使用像 curl 或 Postman 這樣的工具來調用基於您輸入的值進行預測的端點。

curl -X POST "http://127.0.0.1:8000/predict/" -H "Content-type: application/json" -d '{"feature": 3}'

步驟 7 [選擇性] – 使用 Docker Compose 運行應用程序

您可以使用 docker-compose 來集装箱化您的應用程序並運行它。通過將您的應用程序集装箱化,可以簡化部署過程,使應用程序更容易部署、擴展和維護。要將您的應用程序定義為 Dockerfile,請遵循 使用 Docker Compose 部署 FastAPI 應用程序 文章中提到的步驟。

結論

在本次教學中,您學習了如何成功地設置一個與 MongoDB 相關的 FastAPI 應用程序,創建了一個簡單的基於 AI 的應用程序,能夠存儲和取回輸入預測。

FastAPI 和 NoSQL 數據庫的結合為建立和擴展基於 AI 的應用程序提供了強大而靈活的環境。

Source:
https://www.digitalocean.com/community/tutorials/set-up-fastapi-app-with-nosql-db