2025年9月15日 星期一

「Flask + MongoDB」REST API 最小實作與使用說明

 這是一套「Flask + MongoDB」REST API 最小實作與使用說明。

可直接套到你現有的 MongoDB docker-compose。

專案結構

flask-mongo-api/ ├─ app.py ├─ requirements.txt ├─ .env.example ├─ Dockerfile └─ docker-compose.yml # 可選;若你已有 mongodb compose,就只補一個 app 服務

requirements.txt

Flask==3.0.3 pymongo==4.8.0 python-dotenv==1.0.1

.env.example

FLASK_ENV=production PORT=8000 MONGO_URI=mongodb://mongo:27017/appdb DB_NAME=appdb COLL_NAME=items API_KEY=changeme123

Dockerfile

FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app.py . ENV PORT=8000 EXPOSE 8000 CMD ["python", "app.py"]


docker-compose.yml(含 app 與 mongo,

若你已有 MongoDB,

只保留 app 區段並對上你的網路與環境變數)

version: "3.9" services: mongo: image: mongo:7 restart: unless-stopped ports: ["27017:27017"] volumes: - mongo_data:/data/db api: build: . depends_on: [mongo] environment: - MONGO_URI=mongodb://mongo:27017/appdb - DB_NAME=appdb - COLL_NAME=items - API_KEY=changeme123 - PORT=8000 ports: ["8000:8000"] restart: unless-stopped volumes: mongo_data:




啟動

cp .env.example .env # 可選 docker compose up -d --build # 或本機 pip install -r requirements.txt python app.py

範例資料格式

{ "title": "sample", "price": 1200, "tags": ["demo","v1"], "meta": {"brand":"abc","color":"black"} }

範例請求(curl)

# 健康檢查 curl -H "X-API-Key: changeme123" http://localhost:8000/health # 建立 curl -X POST http://localhost:8000/api/v1/items \ -H "Content-Type: application/json" -H "X-API-Key: changeme123" \ -d '{"title":"sample","price":1200,"tags":["demo","v1"]}' # 分頁查詢(全文 + 標籤 + 時間窗) curl -G http://localhost:8000/api/v1/items \ -H "X-API-Key: changeme123" \ --data-urlencode "q=sample" \ --data-urlencode "tag=demo" \ --data-urlencode "page=1" \ --data-urlencode "size=10" # 取單筆 curl -H "X-API-Key: changeme123" http://localhost:8000/api/v1/items/<_id> # 更新 curl -X PATCH http://localhost:8000/api/v1/items/<_id> \ -H "Content-Type: application/json" -H "X-API-Key: changeme123" \ -d '{"price":1399,"tags":["demo","v2"]}' # 刪除 curl -X DELETE -H "X-API-Key: changeme123" http://localhost:8000/api/v1/items/<_id> # 批次新增 curl -X POST http://localhost:8000/api/v1/items/bulk \ -H "Content-Type: application/json" -H "X-API-Key: changeme123" \ -d '[{"title":"a"},{"title":"b","tags":["x"]}]' # 聚合(每個 tag 的件數) curl -X POST http://localhost:8000/api/v1/items/aggregate \ -H "Content-Type: application/json" -H "X-API-Key: changeme123" \ -d '[{"$unwind":"$tags"},{"$group":{"_id":"$tags","count":{"$sum":1}}},{"$sort":{"count":-1}}]'

與你現有 MongoDB compose 整合

  • 若你已有 /mnt/data/docker-compose-mongodb.yml,保持該 mongo 服務不變。

  • 在你的 compose 加入 api 服務區塊,MONGO_URI 指向現有 mongo 服務名稱與資料庫名稱

  • 確保兩服務在同一個 docker network。

最小實務建議

  • 加 API_KEY 或反向代理層驗證。必要時加 JWT。

  • 對高頻欄位建立索引(已示範 created_at、tags、全文 q)。

  • 以 ISO8601 處理時間欄位。用 UTC。

  • 生產環境加備援連線字串與寫入關聯(Replica Set)。




沒有留言:

張貼留言