哈嘍大家好,我是咸魚
在《Flask Web 開發指南 pt.1》中,咸魚跟大家介紹了 Flask 的由來——誕生于一個愚人節玩笑,簡單介紹了一些關于 Flask 的概念,并且撰寫了一個簡單的 Flask 程式
在撰寫 Flask 程式的時候,你需要注意你的程式檔案不要命名為 flask.py,建議命名為 app.py 或者 wsgi.py
但如果你的程式不是叫 app.py 或者 wsgi.py,那么你就需要設定環境變數 FLASK_APP 的值為程式名字
設定環境變數有兩種方法,在《開發指南 pt.1》有提到,大家可以去看一下

運行環境
我們知道,代碼的運行環境一般分為開發環境和生產環境
開發環境指的是我們在本地撰寫和測驗程式時的計算機環境
而生產環境也叫線上環境,指的是程式部署在互聯網能夠對外提供服務且供用戶使用的環境
在 Flask 中,Flask 會根據運行環境的不同來改變相應的行為和設定,建議小伙伴們在撰寫 Flask 程式的時候將運行環境設定成開發環境

因為在開發環境下,Flask 會開啟除錯模式(Debug Mode),這時候執行 flask run啟動程式會激活 Werkzeug 內置的除錯器和多載器,這能更好地幫助我們去 debug
-
除錯器(debugger)
當你的程式報錯時,網頁會生成詳細的錯誤資訊,而除錯器允許你在錯誤頁面上執行代碼

首先單擊錯誤資訊右側的命令列圖示,然后會彈出一個視窗要求你輸入 PIN 碼,這個 PIN 碼在你執行 flask run 命令的時候程式會給你



輸入 PIN 碼之后,點擊錯誤堆疊的某個節點右側的命令列圖示,就會出現一個包含代碼執行背景關系資訊的 Python Shell

-
多載器(reloader)
多載器的作用就是檢測程式檔案的變動,然后重啟,當修改了代碼之后,你會在終端看到下面的輸出

這意味著每次修改完代碼不需要手動重啟 flask 程式
PS
網上有些 flask 教程可能告訴你按照下面的方式將 Flask 運行環境將設定成開發環境

這個環境變數在早期版本的 flask 中是適用的,但是后面被棄用了,不建議使用這個環境變數,否則可能會 warning
相關鏈接:https://github.com/docker/docs/issues/15571
URL 路由
注冊路由

在上面這段代碼中,我們通過 route() 裝飾器將根地址與 index() 函式系結在一起,當用戶訪問
http://localhost:5000/ 的時候,就會顯示 index 函式的回傳結果 '<h1>Hello,Flask!</h1>'
通過 route() 裝飾器將 URL 與函式建立關聯的這個程序叫做注冊路由,路由負責管理 URL 與函式之間的映射
即我訪問哪個 URL (前提是這個 URL 已經與函式建立起了關聯),Flask 就去對應的函式下執行并回傳結果給我
這個函式被稱作視圖函式,視圖函式回傳的結果不僅僅是一串字串這么簡單,它還能夠回傳各種鏈接、表單、HTML 檔案等等
上面的代碼中,'/' 為相對 URL,index() 函式為視圖函式
一個 Web 程式其實就是用戶點擊不同的 URL 鏈接,程式內部去執行對應的函式然后回傳對應的結果給用戶,可以說,大部分 Flask 的基本模式就是這一個個注冊路由的實作
為一個視圖函式系結多個 URL

現在無論是訪問 http://localhost:5000/、http://localhost:5000/home 還是 http://localhost:5000/index ,回傳的都是同一個值
動態URL
除此之外,我們還可以在 URL 里定義變數,實作動態 URL
添加變數使用 <變數名> 的形式
例如 /user/<name> ,flask 在處理請求時會把這個變數傳入視圖函式里面

上面的代碼中 user_page() 視圖的 URL 為 /user/<name>,那么像 /user/edison、/user/fish 的請求都會觸發這個函式

但是如果你訪問的時候沒有添加變數(比如訪問 /user ),那么會回傳一個 404 錯誤,該如何解決呢?
常見的方法是設定默認值,當訪問的 URL 里面沒有帶變數時,就會使用默認值,設定默認值有兩種方法:
-
在裝飾器里面使用 default 引數添加默認值
請注意,你需要添加兩條 URL 規則,這樣當用戶訪問 /user 時 flask 才能找到對應的視圖函式

- 在視圖函式里面添加默認值

對于 URL 變數,flask 支持在 URL 里對變數設定處理器,對變數進行預處理

轉換器型別:

關于 URL 后面帶斜杠的問題
這是一個常見但是也容易混淆的問題

上面的代碼里面,這兩條 URL 的尾部一個添加了斜杠一個沒有添加,有什么區別呢?
-
projects() 視圖函式的 URL 尾部有一個斜杠,路徑看起來像一個目錄,如果你訪問
/projects,Flask 會自動幫你重定向到/projects/,即無論是訪問/projects/還是/projects,都能正常回傳 -
about() 視圖函式的 URL 尾部沒有斜杠,路徑看起來像一個檔案,如果你訪問
/about/,Flask 會回傳一個 404 錯誤,因為這樣可以保持 URL 唯一,并幫助搜索引擎避免重復索引同一頁面
端點
上面我們講過,在撰寫 Flask 程式的時候會將 URL 與 視圖函式進行關聯(注冊路由)
即通過將不同 URL 關聯到不同的視圖函式上,以此來實作不同的業務邏輯
但其實在 Flask 中,URL 首先被映射到端點上,然后再映射到視圖函式

端點通常用來標記一個視圖函式以及對應的 URL,默認值是視圖函式的函式名

在上面的代碼中,端點即視圖函式的名稱hello
當然你也可以修改端點名(通常不建議這么做)

當訪問 hhttp://localhost:5000/hello 時,URL 首先映射到端點 say_hello 上,然后與端點 say_hello 相關聯的視圖函式 hello() 就會處理這個請求
在 web 程式中,URL 無處不在,如果我們在撰寫 web 程式的時候使用 URL 都是用硬編碼方式,那么就會大大降低代碼的易用性
硬編碼是指在寫代碼程序中將變數用一個固定數值表示,如果后續想要修改這個變數就非常困難
比如在 flask 中,如果你修改了某個路由的 URL,那么在其他呼叫到這個 URL 的視圖函式里面的 URL 都需要修改,很麻煩
一個常用的解決方法就是使用 Flask 中的 url_for() 函式來獲取 URL

url_for() 函式中第一個引數為端點,這說明端點通常用作反向查詢 URL 地址

在上面的代碼中,端點即視圖函式的函式名 index,通過呼叫 url_for() 函式就可以獲得對應的 URL
如果你的視圖函式系結的是動態 URL,那么需要在 url_for() 函式中添加相關引數

上面所說的 URL 都是相對 URL(URL 中的 path 部分),如果你想獲得絕對 URL,需要在 url_for() 函式中添加相關引數 _external=True

感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549483.html
標籤:Python
上一篇:騰訊出品小程式自動化測驗框架【Minium】系列(七)測驗框架的設計和開發
下一篇:Python 元編程
