一、前言
參考https://www.cnblogs.com/poloyy/p/14994738.html
- 前面幾篇文章講的路由路徑都是固定的,就是一個路徑和一個視圖函數綁定,當訪問這條路徑時會觸發相應的處理函數
- 這樣無法處理複雜的情況,比如常見的一個課程分類下有很多個課程,那麼他們的 path 可能是 /course/class_1,/course/class_2,/course/class_3...僅最後的序號不同,其他部分都是相同的,如果每一條 path 都寫一個單獨的視圖函數來處理,那複用性會很差,代碼量也會很多
- 所以咱們要使用動態路由,路由中的路徑是一個包含有參數的模板,這樣就可以匹配多條路徑
二、靜態路由
靜態路由的例子,靜態路由存在的問題:三個視圖函數的功能邏輯是相同的,存在明顯的邏輯代碼重複
from flask import Flask app = Flask(__name__) @app.route('/user/tom') def show_user_tom(): return 'My name is tom' @app.route('/user/jerry') def show_user_jerry(): return 'My name is jerry' @app.route('/user/mike') def show_user_mike(): return 'My name is mike' if __name__ == '__main__': app.run()
三、動態路由
1、動態路由說明
Flask 中動態路由是指帶有參數的頁面路徑,大概格式如下:/prefix/<參數> ,它是一個模板,可以匹配多條路徑,將參數放置在符號 < > 之間
2、將上面靜態路由優化成動態路由
from flask import Flask,request app = Flask(__name__) @app.route('/user/<name>') def show_user(name): # Python 中的'%s'%用法:一種字符串格式化的語法, 基本用法是將值插入到%s佔位符的字符串中 # %s,表示格式化一個對象爲字符,%(取代s的字符串) return '我的名字是:%s' % name if __name__ == '__main__': app.run()
- 匹配所有以 /user/ 開頭的路徑
- 視圖函數 show_user 有一個參數 name
- 假設實際的路徑是 /user/張三,那麼會與 /user/<name> 匹配成功,並且將張三 存儲到參數 name 中
3、轉換器
在 Flask 中,動態路由的參數類型默認是 string,但是也可以指定其他類型,比如數字 int 等
以下代碼定義了四條動態路由:
from flask import Flask app = Flask(__name__) @app.route('/user/<name>') def show_user(name): return 'My name is %s' % name @app.route('/age/<int:age>') def show_age(age): return 'age is %d' % age @app.route('/price/<float:price>') def show_price(price): return 'price is %f' % price @app.route('/path/<path:name>') def show_path(name): return 'path is %s' % name if __name__ == '__main__': app.run()
/age/<int:age> postman 發起請求的結果
注:一個動態路由可以包含多個參數
@app.route('/all/<path:path>/name/<string:name>/age/<int:age>/price/<float:price>') def show_all(name, path, age, price): return f"path is {path}\nname is {name}\nage is {age}\nprice is {price}"
四、Flask 的 Debug 模式
1、Flask 程序可以運行在 Debug 模式下,Debug 模式提供瞭如下功能:
1)當 Flask 程序出現錯誤時,在瀏覽器中提示錯誤的詳細信息
2)修改 Flask 程序代碼後,Flask 程序會自動重新加載,不需要重啓 Flask 程序,即可在瀏覽器中看到修改後的效果