給路由傳參
有時我們需要將同一類 URL 映射到同一個視圖函數處理,比如:使用同一個視圖函數來顯示不同用戶的個人信息。
路由傳遞參數
@app.route('/user/<user_id>') #默認爲str類型
def user_info(user_id):
return 'hello %s' % user_id # 用%是接收
路由傳遞的參數默認當做 string 處理,也可以指定參數的類型
路由傳遞參數指定類型
@app.route('/user/<int:user_id>') # 指定int類型
def user_info(user_id):
return 'hello %d' % user_id # 使用%d接收
這裏指定int,尖括號中的內容是動態的,在此暫時可以理解爲接受 int 類型的值,實際上 int 代表使用 IntegerConverter
去處理 url 傳入的參數
flask自帶的類型有
#: the default converter mapping for the map.
DEFAULT_CONVERTERS = {
"default": UnicodeConverter,
"string": UnicodeConverter,
"any": AnyConverter,
"path": PathConverter,
"int": IntegerConverter,
"float": FloatConverter,
"uuid": UUIDConverter,
}
自定義路由匹配——自動以轉換器
在 web 開發中,可能會出現限制用戶訪問規則的場景,那麼這個時候就需要用到正則匹配,根據自己的規則去限定請求參數再進行訪問
具體實現步驟爲:
- 導入轉換器基類:在 Flask 中,所有的路由的匹配規則都是使用轉換器對象進行記錄
from werkzeug.routing import BaseConverter
- 自定義轉換器:自定義類繼承於轉換器基類
class RegexConverter(BaseConverter):
regex = r"[0-9]{6}" # 規則:6位數字
- 添加轉換器到默認的轉換器字典中
# 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字爲: re
app.url_map.converters['re'] = RegexConverter
# 此句很像是創建一個RegexConverter的實例對象但是後面不帶括號
- 使用自定義轉換器實現自定義匹配規則
@app.route("/index/<re:uer_id>")
def index(uer_id):
return "index %s" % uer_id
但是這種方式一個自定義轉換器只能滿足一個規則,所有肯定是不可行的
自定義帶參路由匹配——帶參轉換器
定義代碼如下:
class RegexConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
#BaseConverter.__init__(RegexConverter,url_map) 不喜歡用super的也可以這樣寫
# 將接受的第1個參數當作匹配規則進行保存
self.regex = args[0]
#將自己定義的轉換器添加到默認轉換器列表中
app.url_map.converters['re']=RegexConverter
@app.route('/user/<re(r"[0-9]{6}"):user_id>') # 在此處re()括號內填匹配規則
def index(user_id):
return 'index %s' % user_id