iT邦幫忙

2023 iThome 鐵人賽

DAY 28
1
AI & Data

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

Day 28:Flask計畫.RESTful API 之門

  • 分享至 

  • xImage
  •  

前情提要

  在Day 28:Flask計畫.IP 與 PORT 之門中,你們拆開風扇後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
  你們發現這個門禁系統的 Flask 容器沒有設定密碼或驗證機制,所以你們打算用Docker直接訪問它的 Web 介面,然後用 POST 請求來傳送開門指令。但事情沒有那麼簡單,因為你們想了幾個方法,但不是沒有權限,就是不知道IPPORT,結果卡住了。接著毛帽哥想到,可以用「requests 發送HTTP請求」。

使用 Python 開發 Flask 網頁程式


  「但是用這個方法感覺要試很多次欸……」你皺眉,很懷疑這個方法,「IP位置是4個範圍0~255的數字組成,PORT號碼是0~65535的數字組成,那不是要跑很久?」
  「對啊,還有可能被防火牆之類的擋下來」眼鏡仔附和,「可能是覺得反正我們會試很久,所以才乾脆不做安全措施吧。真是殺傷力不大,侮辱性極強……」
  「沒辦法了,只能試試看了。」毛帽哥說,「我們可以用Python的itertools模組來產生所有組合,再用Multiprocessing模組來加速運算,然後用Pool 類別同時發送多個HTTP請求,來提高效率。」

關於「 Python itertools 模組的窮舉排列組合」,可以參考 開心學程式(2019) 寫的這篇文章
關於「 Python multiprocessing 模組 和 Pool 類別」,可以參考 Amo Chen(2023) 寫的這篇文章

  • 文章中透過寄信給 100 位使用者的例子,講述了平行處理的使用優點。還包含了如何使用 Pool 寄信給 100 位使用者的程式碼實例。
  • 假設每封信需要 1 秒寄出,那麼如果不使用平行處理,單以 for 迴圈處理,寄完 100 封信就需要 100 秒;如果以 4 個 workers 平行處理的話,理論上可以在 25 秒(100 / 4)左右處理完。

  你們看著程式在跑,但隨著時間一分一秒過去,都沒有成功的跡象。你感覺這就像是在一條有無數道門的長廊,尋找著正確的那道門,但是一直找不到,也不知道何時會找到。你們的心情也漸漸從滿心期待變成近乎絕望。
  就在這時,電腦上突然出現一行字:

Success! The IP address is 192.168.100 and the PORT number is 5000.

  你們成功了,不敢相信地看著這行字!於是你們打鐵趁熱,用Postman工具發送了POST請求,結果發送成功。電腦出現了一個HTML畫面,上面寫著:

物聯網幽靈的挑戰,用以下的線索,大喊芝麻開門吧!

  • Flask 容器的 IP 位址和 PORT 號碼是 192.168.1.100:5000
  • Flask 容器的密碼或驗證機制是 Basic Auth,帳號是 admin,密碼是 123456
  • Flask 容器的 API 路由是 /open_door

  「這是……在玩哪招?」你問。
  「看來大漂亮是要我們用Flask來建立一個RESTful API……」眼鏡仔大嘆一口氣,「想不到還沒辦法打開門……」
  「你剛才說Flask是用Python寫的輕量級Web框架,可以讓我們快速建立Web應用程式。」你問,「那RESTful API又是什麼東西……?」
  「RESTful API
  「那她要我們建立什麼RESTful API?」

關於Postman工具,是一個模擬HTTP請求的工具,可以用來測試網路程式的功能和效能。
HTTP方法是用來定義網路上資料的操作方式,常見的有GETPOSTPUTDELETE等。
API是應用程式介面的縮寫,軟體之間溝通的規章和橋樑。可以想像成是一位翻譯,幫助不同國家、不同語言的人溝通。
RESTful API 就是一種API的架構風格,因為有更加清晰、簡潔、易於使用和維護的特色,可以讓不同的軟體和程式可以更方便的溝通。
關於「使用 Flask 框架建立 RESTful API」可以參考氣球寫的這篇文章


上一篇
Day 28:Flask計畫.IP 與 PORT 之門
下一篇
Day 29:物聯網幽靈的RESTful API 謎題.芝麻開門
系列文
AIoT的藍藥丸與紅藥丸,你選哪個?62
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言