Flask 中的動態路由
在前面章節使用的路由中,我們已經知道了一條固定的路徑和一個處理函數相綁定,當訪問這條路徑時會觸發相應的處理函數。路由中的路徑是固定的,一條路徑對應一個處理函數,無法處理復雜的情況。本小節介紹動態路由,路由中的路徑是一個包含有參數的模板,可以匹配多條路徑。
Tips:本節課所有的代碼已經上傳到 Github 可以點擊這里進行下載。
1. 靜態路由
在前面章節使用的路由中,路徑是固定的、不變的。例如,網站中有 3 個用戶 tom、jerry、mike,提供了 3 個路徑訪問這 3 個用戶的信息,如下表所示:
路徑 | 處理函數 |
---|---|
/user/tom | show_user_tom() |
/user/jerry | show_user_jerry() |
/user/mike | show_user_mike() |
編寫程序 static.py,包含有 3 個路由:
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'
app.run()
在第 4 行,將路徑 ‘/user/tom’ 與處理函數 show_user_tom () 綁定;在第 8 行,將路徑 ‘/user/jerry’ 與處理函數 show_user_jerry () 綁定;在第 12 行,將路徑 ‘/user/mike’ 與處理函數 show_user_mike () 綁定。
程序 static.py 存在一個明顯的問題:3 個頁面處理函數的功能邏輯是相同的,存在有明顯的代碼重復。在下個小節,使用動態路由解決代碼重復的問題。
2. 動態路由
Flask 中動態路由是指帶有參數的頁面路徑,如下所示:
/prefix/<參數>
它是一個模板,可以匹配多條路徑,將參數放置在符號 <和> 之間。
針對上一節的例子,頁面路徑 /user/<name> 可以匹配如下 3 個頁面路徑:
- /user/tom
- /user/jerry
- /user/mike
因此,只需要編寫一個頁面處理函數即可處理以上 3 個頁面,編寫程序 dynamic.py:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<name>')
def show_user(name):
return 'My name is %s' % name
app.run()
在第 4 行,定義了動態路徑 /user/<name>,匹配所有以 /user/ 開頭的路徑;在第 5 行,定義了相應的處理函數 show_user,函數有一個參數 name;假設實際的路徑是 /user/tom,與 /user/<name> 匹配成功,并且將 tom 存儲到參數 name 中。
比較上一個小節 static.py 和本小節的 dynamic.py,通過動態路由可以使用一個處理函數處理一批相關的頁面路徑,在很多應用場景中是必需的。
3. 轉換器
在 Flask 中,參數類型默認是 string,但是也可以指定其他類型,比如數字 int 等,如下所示:
/prefix/<類型轉換器:參數>
類型轉換器將默認的字符串類型轉換為指定的類型,Flask 中主要有以下 4 種基本類型轉換器:
類型 | 說明 |
---|---|
string | 默認,可以不用寫 |
int | 整數 |
float | 同 int,但是接受浮點數 |
path | 和 string 相似,但接受斜線 |
4. 類型轉換的例子
本節編寫程序 conv.py 演示轉換器的功能:
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
app.run()
程序 conv.py 中定義了 4 條動態路由,如下表所示:
動態路由 | 參數類型 | 參數 | 處理函數 |
---|---|---|---|
/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> | /user/tom | My name is tom |
/age/<int:age> | /age/26 | age is 26 |
/price/<float:price> | /price/31.4 | price is 31.4 |
/path/<path:name> | /path/abc/xyz | path is abc/xyz |
5. 小結
本節講解了 Flask 中的動態路由的概念、如何提取路由中的參數和設置參數類型,使用思維導圖概括如下: