哈嘍大家好,我是鹹魚
在《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 地址
如果你的檢視函式繫結的是動態 URL,那麼需要在 url_for() 函式中新增相關引數
上面所說的 URL 都是相對 URL(URL 中的 path 部分),如果你想獲得絕對 URL,需要在 url_for() 函式中新增相關引數 _external=True
感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力!