iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
AI & Data

AIoT的藍藥丸與紅藥丸,你選哪個?系列 第 59

補充:撰寫Flask Web來存取Mongo DB (4)

  • 分享至 

  • xImage
  •  

前言

https://ithelp.ithome.com.tw/upload/images/20231014/20162501cfK0zJ9aqN.jpg
Day 29:物聯網幽靈的RESTful API 謎題.芝麻開門中提到:用Flask來建立一個RESTful API,並且要按照「宿舍訪客名單 API 的需求規格」需求規格,用 Flask 跟 PyMongo來實作API,然後用Postman來測試它的功能和效能。
這個程式碼的目的是建立一個宿舍訪客名單的網路服務,讓使用者可以透過網路來查詢、新增、修改或刪除訪客的資料。

回顧

目標

七、定義路由和 HTTP 方法

用變數 id 傳遞參數

用 auth.login_required decorator 要求驗證

這就像是管理員要先定義好另一種規則,如果有人要修改或刪除特定的訪客資料,他們要用網址 http://192.168.1.100:5000/visitors/ 來跟管理員聯絡。

# 定義路由和 HTTP 方法,並使用變數 id 傳遞參數,並使用 auth.login_required decorator 要求驗證
@app.route("/visitors/<id>", methods=["PUT", "DELETE"])
@auth.login_required
def visitor(id):
  • @app.route("/visitors/", methods=["PUT", "DELETE"])
    • 上一篇提到的@app.route("/visitors", methods=["GET", "POST"])有點不同。
    • 這裡使用了路由參數傳遞,可以定義路由網址接收參數,例如:@app.route('/user/<username>') (Nanami Lemon, 2021)

1. PUT(修改一筆訪客資料)

	# 如果是 PUT 方法,則修改一筆訪客資料
	if request.method == "PUT":
		# 取得請求中的 JSON 資料
		data = request.get_json()
		# 檢查 JSON 資料是否包含所有必要的欄位
		if data and all(key in data for key in ["name", "age", "gender", "phone", "address"]):
			# 執行 update_one 修改符合 id 的訪客資料,並取得修改的筆數
			result = mongo.db.visitors.update_one({"_id": id}, {"$set": data})
			count = result.modified_count
			# 如果修改的筆數為零,則回傳 404 狀態碼和錯誤訊息
			if count == 0:
			return jsonify({"status": 404, "message": "Visitor not found"}), 404
			# 如果修改的筆數不為零,則回傳 200 狀態碼和修改的筆數
			else:
			return jsonify({"status": 200, "count": count}), 200
		# 如果 JSON 資料不完整,則回傳 400 狀態碼和錯誤訊息
		else:
		return jsonify({"status": 400, "message": "Missing or invalid data"}), 400
  • 如果是 PUT 方法,則修改一筆訪客資料
    if request.method == "PUT"::通常用來進行資源更新 (林信良, 2013)
    • 取得請求中的 JSON 資料
      request.get_json()
      撰寫Flask Web來存取Mongo DB (3)中,POST程式碼部分有提到:
      Flask API要取得request的值的其中一種方式,取得JSON的值 (無言小獅子, 2022)

    • 檢查 JSON 資料是否包含所有必要的欄位
      ["name", "age", "gender", "phone", "address"]
      撰寫Flask Web來存取Mongo DB (3)中,POST程式碼部分有提到:
      JSON的資料格式中,用中括號[]表示的是陣列(array),是一系列的值(value)所組成的 (silly_letter,2022)

      • 執行 update_one 修改符合 id 的訪客資料,並取得修改的筆數
        update_one:在MongoDB指令(2)中有提到:update_one指令是用來更新文件的,就像是圖書館裡的一本書被借走了,要更新資訊為──已借出。

      • 如果修改的筆數為零,則回傳 404 狀態碼和錯誤訊息
        撰寫Flask Web來存取Mongo DB (3)中,GET程式碼部分有提到:
        常常聽到的404(not found)是一種HTTP Status Code,代表找不到請求的資源 (jim_chung, 2020)

      • 如果修改的筆數不為零,則回傳 200 狀態碼和修改的筆數
        撰寫Flask Web來存取Mongo DB (3)中,GET程式碼部分有提到:
        一般正常回應的情況下,會回傳200(OK)代表成功 (jim_chung, 2020)

      • 如果 JSON 資料不完整,則回傳 400 狀態碼和錯誤訊息
        撰寫Flask Web來存取Mongo DB (3)中,POST程式碼部分有提到:
        400狀態碼:是一種HTTP Status Code,代表錯誤的請求 ( Hypertext Transfer Protocol: Response Status Codes)
          表示伺服器無法或不願處理請求,因為伺服器認為這是客戶端的錯誤(可以想像成用外送平台點餐時,如果外送員發現你的訂單內容有問題,或是地址寫錯還要請外送員免費幫你送到更遠的地方,外送員可能會棄單)。

# 如果是 DELETE 方法,則刪除一筆訪客資料
elif request.method == "DELETE":
    # 執行 delete_one 刪除符合 id 的訪客資料,並取得刪除的筆數
    result = mongo.db.visitors.delete_one({"_id": id})
    count = result.deleted_count
    # 如果刪除的筆數為零,則回傳 404 狀態碼和錯誤訊息
    if count == 0:
        return jsonify({"status": 404, "message": "Visitor not found"}), 404
    # 如果刪除的筆數不為零,則回傳 200 狀態碼和刪除的筆數
    else:
        return jsonify({"status": 200, "count": count}), 200
  • 如果是 DELETE 方法,則刪除一筆訪客資料
    if request.method == "DELETE"::通常用來刪除資料 (林信良, 2013)
    • 執行 delete_one 刪除符合 id 的訪客資料,並取得刪除的筆數
      update_one:在MongoDB指令(2)中有提到:update_one指令是用來從集合中刪除單一文件,就像是從圖書館下架一本書,要把這本書的資訊從圖書館的系統中刪掉。

下集預告

傳送門

撰寫Flask Web來存取Mongo DB (1)討論如何實作以下內容:

  • 零、設定環境
  • 一、引入 Flask 和 PyMongo 套件
  • 二、建立 Flask 應用程式
  • 三、設定 MongoDB 連線資訊

撰寫Flask Web來存取Mongo DB (2)討論如何實作以下內容:

  • 四、建立 HTTPBasicAuth 物件
  • 五、設定帳號密碼驗證機制
  • 六、定義路由和 HTTP 方法,並使用 auth.login_required 要求驗證

撰寫Flask Web來存取Mongo DB (3)討論如何實作以下內容:

  • 六、定義路由和 HTTP 方法,並用 auth.login_required decorator 要求驗證
    • 6-1 如果是 GET 方法,則取得所有或特定的訪客資料
    • 6-2 如果是 POST 方法,則新增一筆訪客資料
      撰寫Flask Web來存取Mongo DB (4)討論如何實作以下內容:
  • 七、定義路由和 HTTP 方法,用變數 id 傳遞參數,並用 auth.login_required decorator 要求驗證
    • 7-1 如果是 PUT 方法,則修改一筆訪客資料
    • 7-2 如果是 DELETE 方法,則刪除一筆訪客資料
      撰寫Flask Web來存取Mongo DB (5)討論如何實作以下內容:
  • 八、啟動 Flask 應用程式,並指定主機和埠號

上一篇
補充:撰寫Flask Web來存取Mongo DB (3)
下一篇
補充:撰寫Flask Web來存取Mongo DB (5)
系列文
AIoT的藍藥丸與紅藥丸,你選哪個?62
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言