前言
在完成ALPHA Camp學期2-3的課程,因為接著上了彭彭老師的WeHelp coding bootcamp,再加上年底工作也較忙,似乎還沒機會好好整理學期2-3的心得,這邊可能至少先欠一篇文章,想先根據這周末學習Flask session的運作機制做些簡單的紀錄。
何謂Flask
相較於之前學習是建立在Express架構,再透過Mongoose這個ODM操作MongoDB,這次訓練營的課程則是先使用Python Flask這個套件。Flask 是個輕量級的應用程式框架(micro-framework),簡單說就是彈性較佳且使用較簡單,不像另一個Python常使用的Web應用程式框架Django,可能在表單驗證、template enginee有自己的寫法,Flask給予開發者較多的彈性可以使用更多套件增加功能,另有些優點供大家參考 :
- 符合WSGI ⇒ WSGI是個由Python定義的通用介面,建立於Web框架與Web server之間,一個WSGI的流程用以將客戶端的請求傳遞給Web應用程式,再將後端Server-side的回應傳回給客戶端。一般來說客戶端的靜態內容會由web server提供,http動態的數據則透過WSGI交給Web框架提供,常見的web server有Apache、IIS等,常見的Web框架有Flask、Django。由於Flask 是運用Werkzeug 這個函示庫開發的框架,而Werkzeug又符合WSGI的規範,因此Flask其實符合WSGI的標準,可以讓我們更方便設定web server,至於Flask 如何體現WSGI可參考此文章。
- Jinja2樣版引擎 ⇒ 如同Express裡面handlebars的功能,在Flask因為使用此樣板引擎,可以讓我們直接使用render_template到一個html檔案並與後端server溝通,避免在該路由撰寫太多html語法,造成程式碼難以維護與閱讀。
- 不會決定使用哪個資料庫,但提供各種擴充套件整合不同資料庫。
- 可執行偵錯,如有錯誤會向PYTHON CONSOLE、HTTP CLIENT送出請求。
Flask session
在介紹什麼是Flask後,在完成第四周的作業也稍微另外學習Flask session是如何運作的。依照自己先前的瞭解,http是個無狀態的通訊協定,每個request都是各自執行且不會留存任何紀錄,因此需要用session去儲存資料,讓我們可以在同一個Web應用程式去讀取不同的page。通常是在server端利用session存資料,前端的web server的cookie資訊裡面則會有個session id,在瀏覽器發送請求時會夾帶cookie,後端的AP server會跟據session id找到相對應的session物件並回傳給瀏覽器。然而Flask的session機制好像與我之前的認知稍有不同,並非建立於server端,而是client端的cookie based。
在Flask將資料儲存在session這個object裡面時,可看成是儲存在client端,因為資料其實是存在web server,每次新增內容到session就會新增一個新的cookie(cryptographically-signed cookies),並透過secret_key做簽章。需注意的是這所謂的「secret_key」並不是用於加密(切勿儲存機密資料),而是用來做數位簽章確認資料的完整性,簡單說是每個人都可以知道cookie裡面的資料,但只有server知道cookie是否被串改,如果被串改就無法登入該帳戶。
這裡做個簡單的驗證,以我第四週交的作業為例,登入後的request封包看似有經過加密,
但實際上此字串是透過base64進行編碼,將其進行decode後,就可以取得cookie裡面的session資料,這也是為什麼建議不要儲存敏感性資料。
且我們亦可透過瀏覽器的開發者工具嘗試修改cookie的值
再重新整理此頁面就會發現被登出,這來自於後端伺服器驗證cookie遭竄改故使其失效。
結尾
以上是這周目前對於Flask多學習的簡單心得,希望之後在完成作業之餘,也可多找資料讓學習不僅僅只侷限於visual studio code上的程式碼,而是更瞭解後面所使用套件的運作原理。
參考資源
- Developing Web Applications with Python and Flask - Introduction | TestDriven.io
- Free Intermediate Flask Course | Rithm School
- [AF] ELI5: how sessions work in Flask? : flask (reddit.com)
- WSGI、Flask及Werkzeug三者之间的关系_慕城南风的博客-CSDN博客_wsgi werkzeug
- Python Web — 快速建置網站的Flask套件. 一般我們想到Python程式,就會聯想到大數據、資料分析、AI等等的應用範疇;想… | by Sean Yeh | Medium