前情提要
在Day 28:Flask計畫.RESTful API 之門中,你們拆開風扇後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
你們發現這個門禁系統的 Flask 容器
沒有設定密碼或驗證機制,所以你們打算用Docker
直接訪問它的 Web 介面
,然後用 POST 請求
來傳送開門指令。毛帽哥提議用「requests
發送HTTP請求
」來找出IP
和PORT
,雖然不是最有效率的方法,但你們只好硬著頭皮上了。
就在你們看到螢幕上跑出「Success!」,準備迎接勝利的時候,卻發現門沒有打開,取而代之的是HTML畫面
中跳出的提示訊息:
物聯網幽靈的挑戰,用以下的線索,大喊芝麻開門吧!
- Flask 容器的 IP 位址和 PORT 號碼是
192.168.1.100:5000
- Flask 容器的密碼或驗證機制是
Basic Auth
,帳號是 admin
,密碼是 123456
- Flask 容器的 API 路由是
/open_door
「看來大漂亮是要我們用Flask
來建立一個RESTful API
……」眼鏡仔大嘆一口氣,「想不到還沒辦法打開門……」
「那她要我們建立什麼RESTful API
?」
RESTful API
就是一種API的架構風格,因為有更加清晰、簡潔、易於使用和維護的特色,可以讓不同的軟體和程式可以更方便的溝通。
關於「使用 Flask 框架建立 RESTful API」可以參考氣球寫的這篇文章
撰寫Flask Web來存取Mongo DB
你們在房間翻找著大漂亮還有沒有留下其他線索,結果在她的抽屜找到一份文件,是宿舍的訪客名單。
「你們看!我找到這個」你喊著眼鏡仔跟毛帽哥過來看「看來大漂亮要我們建立的是──管理宿舍訪客名單的API。」
「真的噎!這裡還有寫宿舍訪客名單API的需求規格!」毛帽哥說。
宿舍訪客名單 API 的需求規格
宿舍訪客名單包括:姓名、年齡、性別、電話、地址等欄位。
- API 必須支援以下四種 HTTP 方法:
- GET:取得所有或特定的會員資料。
- POST:新增一筆會員資料。
- PUT:修改一筆會員資料。
- DELETE:刪除一筆會員資料。
- API 必須回傳 JSON 格式的資料,並且包含狀態碼和訊息。
- API 必須使用 MongoDB 資料庫來儲存和操作會員資料。
「看來,我們要按照這個需求規格,用Flask
來實作這個API
,然後用Postman
來測試它的功能和效能。」
「但她要我們做這個幹嘛?我們就算做出來,也還是出不去啊!」毛帽哥說。
「說不定她是為了給我們一個機會,在宿舍訪客名單上加入我們三個的資料?」你突然靈機一動,「如果我們也在宿舍名單上,那就代表我們不是違規進來的,就可以正大光明離開女生宿舍了!」
「聽起來有道理噎!」眼鏡哥點頭表示認同,「那我們就用 Flask 跟 PyMongo 來寫吧!」
「那要怎麼開始?」你已經躍躍欲試。
關於「Flask-PyMongo」可以參考dcrosta寫的這篇文章
宿舍訪客名單
我們可以把這個程式碼比喻成一個宿舍管理員,他負責以下的工作:
-
零、設定環境
-
一、引入 Flask 和 PyMongo 套件:
這就像是管理員要先準備好一些工具,例如一本筆記本(Flask)和一個資料庫(PyMongo),才能開始工作。
-
二、建立 Flask 應用程式:
這就像是管理員要先開啟筆記本,才能記錄訪客的資料。
-
三、設定 MongoDB 連線資訊:
這就像是管理員要先連接到資料庫,才能存取訪客的資料。
-
四、建立 HTTPBasicAuth 物件:
這就像是管理員要先準備好一個驗證機制,才能確保只有合法的使用者才能使用他的服務。
-
五、設定帳號密碼驗證機制:
這就像是管理員要先設定好一組帳號密碼,並且在每次有人要使用他的服務時,都要先檢查他們是否提供正確的帳號密碼。
-
六、定義路由和 HTTP 方法,並用 auth.login_required decorator 要求驗證:
這就像是管理員要先定義好一些規則,例如:
- 6-1 如果是 GET 方法,則取得所有或特定的訪客資料:
這就像是管理員要根據使用者的需求,從資料庫中找出相對應的訪客資料,並且回傳給使用者。具體來說:
- 取得查詢參數 name,如果沒有則預設為空字串:
這就像是管理員要先問使用者想查詢哪一位訪客的名字,如果使用者沒有說明,就預設為空字串。
- 如果有 name,則根據 name 查詢特定的訪客資料:
這就像是管理員根據使用者提供的名字,在資料庫中找出符合的訪客資料。
- 如果找不到,則回傳 404 狀態碼和錯誤訊息:
這就像是管理員告訴使用者,他沒有找到這位訪客的資料,並且用 404 這個代碼表示找不到的意思。
- 如果找到,則回傳 200 狀態碼和訪客資料:
這就像是管理員告訴使用者,他已經找到這位訪客的資料,並且用 200 這個代碼表示成功的意思,然後把訪客的資料回傳給使用者。
- 如果沒有 name,則取得所有的訪客資料:
這就像是管理員根據使用者沒有提供名字的情況,在資料庫中找出所有的訪客資料。
- 將查詢結果轉換為列表:
這就像是管理員把找到的所有訪客資料整理成一個列表,方便回傳。
- 回傳 200 狀態碼和訪客列表:
這就像是管理員告訴使用者,他已經找到所有的訪客資料,並且用 200 這個代碼表示成功的意思,然後把訪客列表回傳給使用者。
- 6-2 如果是 POST 方法,則新增一筆訪客資料:
這就像是管理員要根據使用者提供的資料,往資料庫中新增一筆訪客資料,並且回傳結果給使用者。具體來說:
- 取得請求中的 JSON 資料:
這就像是管理員要先從使用者那裡收到一個 JSON 格式的資料,裡面包含了要新增的訪客的相關資訊。
- 檢查 JSON 資料是否包含所有必要的欄位:
這就像是管理員要先檢查使用者提供的資料是否完整,是否包含了姓名、年齡、性別、電話、地址等欄位。
- 執行 insert_one 新增訪客資料到 MongoDB 中:
這就像是管理員在確認資料完整後,把它寫入到資料庫中,並且取得新增的訪客 id。
- 回傳 201 狀態碼和新增的訪客 id:
這就像是管理員告訴使用者,他成功地新增了一筆訪客資料,並且用 201 這個代碼表示新增的意思,然後把新增的訪客 id 回傳給使用者。
- 如果 JSON 資料不完整,則回傳 400 狀態碼和錯誤訊息:
這就像是管理員在發現資料不完整或無效時,告訴使用者他無法新增這筆資料,並且用 400 這個代碼表示錯誤的意思,然後把錯誤訊息回傳給使用者。
-
七、定義路由和 HTTP 方法,用變數 id 傳遞參數,並用 auth.login_required decorator 要求驗證:
這就像是管理員要先定義好另一種規則,例如:
-
八、啟動 Flask 應用程式,並指定主機和埠號
傳送門
撰寫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)討論如何實作以下內容: