前言
- 前面幾篇文章講的路由路徑(rule)都是固定的,就是一個路徑和一個視圖函數綁定,當訪問這條路徑時會觸發相應的處理函數
- 這樣無法處理復雜的情況,比如常見的一個課程分類下有很多個課程,那么他們的 path 可能是 /course/class_1,/course/class_2,/course/class_3...僅最后的序號不同,其他部分都是相同的,如果每一條 path 都寫一個單獨的視圖函數來處理,那復用性會很差,代碼量也會很多
- 所以咱們要使用動態路由,路由中的路徑是一個包含有參數的模板,這樣就可以匹配多條路徑
靜態路由的栗子
網站中有 3 個用戶 tom、jerry、mike,提供了 3 個路由訪問這 3 個用戶的信息
路由 | 視圖函數 |
---|---|
/user/tom | show_user_tom() |
/user/jerry | show_user_jerry() |
/user/mike | show_user_mike() |
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()
靜態路由存在的問題
三個視圖函數的功能邏輯是相同的,存在明顯的邏輯代碼重復
動態路由
Flask 中動態路由是指帶有參數的頁面路徑,大概格式如下
/prefix/<參數>
它是一個模板,可以匹配多條路徑,將參數放置在符號 < > 之間
將上面的靜態路由栗子優化成動態路由
from flask import Flask app = Flask(__name__) @app.route('/user/<name>') def show_user(name): return 'My name is %s' % name if __name__ == '__main__': app.run()
- 匹配所有以 /user/ 開頭的路徑
- 視圖函數 show_user 有一個參數 name
- 假設實際的路徑是 /user/poloyy,那么會與 /user/<name> 匹配成功,並且將 poloyy 存儲到參數 name 中
實際請求結果
轉換器
在 Flask 中,動態路由的參數類型默認是 string,但是也可以指定其他類型,比如數字 int 等
類型 | 說明 |
---|---|
string | 默認,可以不用寫 |
int | 整數 |
float | 同 int,但是僅接受浮點數 |
path | 和 string 相似,但接受斜線 |
轉換器的栗子代碼
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()
上述代碼定義了四條動態路由
動態路由 | 參數類型 | 參數 | 視圖函數 |
---|---|---|---|
/user/<name> | 字符串 | name | show_user |
/age/<int:age> | int | age | show_age |
/price/<float:price> | float | price | show_price |
/path/<path:name> | path | name | show_path |
/user/<name> postman 發起請求的結果
直接看上面的栗子截圖就好了,這里給一個踩坑的栗子
如果 <name> 傳了包含 / 的話,會報 404 哦
/age/<int:age> postman 發起請求的結果
傳整數
傳浮點點數
會直接報 404 哦!
/price/<float:price> postman 發起請求的結果
傳浮點數
傳整數
會直接報 404 哦!
/path/<path:name> postman 發起請求的結果
包含 / 的時候也可以正常請求
沒有 / 的時候,和 string 類型一樣
一個動態路由包含多個參數
@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}"
postman 發起請求的結果