哈嘍大家好,我是鹹魚 在《Flask Web 開髮指南 pt.1》中,鹹魚跟大家介紹了 Flask 的由來——誕生於一個愚人節玩笑,簡單介紹了一些關於 Flask 的概念,並且編寫了一個簡單的 Flask 程式 在編寫 Flask 程式的時候,你需要註意你的程式文件不要命名為 flask.py,建議 ...
哈嘍大家好,我是鹹魚
在《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
感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力!