Flask(5)- 動態路由

小菠蘿測試筆記發表於2021-07-10

前言

  • 前面幾篇文章講的路由路徑(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 發起請求的結果

 

總結

相關文章