關(guān)于flask路由app.route及路由參數(shù)的各種用法解析
flask路由
1.路由的基本定義
什么是路由?
路由就是一種映射關(guān)系。是綁定應(yīng)用程序(視圖)和url地址的一種一對一的映射關(guān)系!
我們在開發(fā)過程中,編寫項(xiàng)目時所使用的路由往往是指代了框架/項(xiàng)目中用于完成路由功能的類,這個類一般就是路由類,簡稱路由。
路由和視圖的名稱必須全局唯一,不能出現(xiàn)重復(fù),否則報錯。
路由重復(fù),走先聲明的,視圖函數(shù)重復(fù)直接報錯。
代碼示例:
# 1. 導(dǎo)入flask核心類 from flask import Flask # 2. 初始化web應(yīng)用程序的實(shí)例對象 app = Flask(__name__) # 開啟debug模式 app.config["DEBUG"] = True # 參數(shù)1:rule設(shè)置當(dāng)前視圖的路由地址 # 參數(shù)2:methods,設(shè)置當(dāng)前視圖的HTTP請求方法,允許一個或多個方法,不區(qū)分大小寫,如果使用非設(shè)置的請求方法來訪問,會報405錯誤 @app.route(rule="/", methods=["get", "post"]) def index(): return "<h1>hello flask1</h1>" if __name__ == '__main__': # 3. 運(yùn)行flask提供的測試web服務(wù)器程序 app.run(host="0.0.0.0", port=5000)
如下,使用非指定請求方法來訪問,會報錯
使用postman來使用post請求
使用get請求測試,可以正常拿到響應(yīng)數(shù)據(jù)
2.路由參數(shù)接收方式
flask中,url可以傳遞路由參數(shù),有2種方式:
路由參數(shù)就是url路徑的一部分。
1.接收任意路由參數(shù)
# 1. 導(dǎo)入flask核心類 from flask import Flask # 2. 初始化web應(yīng)用程序的實(shí)例對象 app = Flask(__name__) # 開啟debug模式 app.config["DEBUG"] = True @app.route(rule="/", methods=["get", "post"]) def index(): return "<h1>hello flask1</h1>" """ 路由參數(shù)的傳遞 尖括號圈住,里面寫上參數(shù)變量名 在視圖中即可通過參數(shù)列表按命名來接收 接收參數(shù)時,如果沒有在設(shè)置路由中設(shè)置參數(shù)的類型,則默認(rèn)參數(shù)類型為字符串類型 """ @app.route("/goods/<cid>/<gid>") def goods(gid, cid): print(gid, type(gid)) print(cid, type(cid)) return f"顯示cid={cid},gid={gid}的商品信息" if __name__ == '__main__': # 3. 運(yùn)行flask提供的測試web服務(wù)器程序 app.run(host="0.0.0.0", port=5000)
瀏覽器訪問,拿到url輸入的數(shù)據(jù)
2.接收限定類型參數(shù)
限定路由參數(shù)的類型,flask系統(tǒng)自帶轉(zhuǎn)換器編寫在werkzeug/routing/converters.py文件中。底部可以看到以下字典:
在這個文件的最后配置
# converters用于對路由中的參數(shù)進(jìn)行格式轉(zhuǎn)換與類型限定的 t.Mapping[str, t.Type[BaseConverter]是為了告訴讀者,里面數(shù)據(jù)左邊是個字符串,右邊是數(shù)據(jù)類型 python3.6新增了一個typing模塊,讓我們在編寫python代碼的變量時,可以同時設(shè)置變量的數(shù)據(jù)類型 DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = { "default": UnicodeConverter, # 默認(rèn)類型,也就是string "string": UnicodeConverter, # 字符串,不包含 / "any": AnyConverter, # 任意類型 "path": PathConverter, # 也是字符串,但是包含了 / "int": IntegerConverter, "float": FloatConverter, "uuid": UUIDConverter, }
系統(tǒng)自帶的轉(zhuǎn)換器具體使用方式在每種轉(zhuǎn)換器的注釋代碼中有寫,請留意每種轉(zhuǎn)換器初始化的參數(shù)。
代碼:
# 1. 導(dǎo)入flask核心類 from flask import Flask # 2. 初始化web應(yīng)用程序的實(shí)例對象 app = Flask(__name__) # 開啟debug模式 app.config["DEBUG"] = True @app.route(rule="/", methods=["get", "post"]) def index(): return "<h1>hello flask1</h1>" """ 通過路由轉(zhuǎn)換器來對路由參數(shù)顯示格式轉(zhuǎn)換和限制類型 """ @app.route("/goods/<float:cid>/<uuid:gid>") def goods(gid, cid): print(gid, type(gid)) print(cid, type(cid)) return f"顯示cid={cid},gid={gid}的商品信息" if __name__ == '__main__': # 3. 運(yùn)行flask提供的測試web服務(wù)器程序 app.run(host="0.0.0.0", port=5000)
此時對于傳入非指定類型的參數(shù),則會報404錯誤
傳指定類型參數(shù),才能正常訪問
3.自定義路由參數(shù)轉(zhuǎn)換器
也叫正則匹配路由參數(shù).
在 web 開發(fā)中,可能會出現(xiàn)限制用戶訪問規(guī)則的場景,那么這個時候就需要用到正則匹配,根據(jù)自己的規(guī)則去限定請求參數(shù)再進(jìn)行訪問
具體實(shí)現(xiàn)步驟為:
- 導(dǎo)入轉(zhuǎn)換器基類BaseConverter:在 Flask 中,所有的路由的匹配規(guī)則都是使用轉(zhuǎn)換器對象進(jìn)行記錄
- 自定義轉(zhuǎn)換器:自定義類繼承于轉(zhuǎn)換器基類BaseConverter
- 添加轉(zhuǎn)換器到默認(rèn)的轉(zhuǎn)換器字典DEFAULT_CONVERTERS中
- 使用自定義轉(zhuǎn)換器實(shí)現(xiàn)自定義匹配規(guī)則
代碼實(shí)現(xiàn)
# 1. 導(dǎo)入flask核心類 from flask import Flask # 2. 初始化web應(yīng)用程序的實(shí)例對象 app = Flask(__name__) # 開啟debug模式 app.config["DEBUG"] = True """ 自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會單獨(dú)準(zhǔn)備一個python文件來保存轉(zhuǎn)換器的定義代碼] """ from werkzeug.routing.converters import BaseConverter #在我們自定義的類里面寫正則規(guī)則,并要繼承BaseConverter class MobileConverter(BaseConverter): """手機(jī)號參數(shù)類型的轉(zhuǎn)換器""" regex = r"1[3-9]\d{9}" # 把自定義路由轉(zhuǎn)換器類注冊到flask項(xiàng)目中,中括號里面的參數(shù)我們下面路由轉(zhuǎn)換器類要用到 app.url_map.converters["mob"] = MobileConverter @app.route("/sms/<mob:mobile>") def sms(mobile): return f"發(fā)送短信給手機(jī)號:{mobile}的用戶" if __name__ == '__main__': # 3. 運(yùn)行flask提供的測試web服務(wù)器程序 app.run(host="0.0.0.0", port=5000)
運(yùn)行程序訪問,但凡不滿足正則規(guī)則的請求,都無法正常訪問
手機(jī)號太短
包含非數(shù)字
滿足正則要求的手機(jī)號,可以正常訪問
但是這樣,我們寫個類就把正則規(guī)則定死了,不方便其他路由調(diào)用
因此,我們需要優(yōu)化,我們需要根據(jù)實(shí)際需要的正則來分別自定義
此時,我們需要將正則作為參數(shù)傳進(jìn)去
導(dǎo)入轉(zhuǎn)換器基類
from werkzeug.routing.converters import BaseConverter
自定義轉(zhuǎn)換器
先看下父類
class RegexConverter(BaseConverter): def __init__(self, map, *args, **kwargs): super().__init__(map, *args, **kwargs) #我們不用進(jìn)行類型限定 self.regex = args[0] - 添加轉(zhuǎn)換器到默認(rèn)的轉(zhuǎn)換器字典中,并指定轉(zhuǎn)換器使用時名字為: re app.url_map.converters["re"] = RegexConverter - 使用轉(zhuǎn)換器去實(shí)現(xiàn)自定義匹配規(guī)則,當(dāng)前此處定義的規(guī)則是:手機(jī)號碼 """ 自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會單獨(dú)準(zhǔn)備一個python文件來保存轉(zhuǎn)換器的定義代碼] """ from werkzeug.routing.converters import BaseConverter class RegexConverter(BaseConverter): def __init__(self, map, *args, **kwargs): super().__init__(map, *args, **kwargs) self.regex = args[0] app.url_map.converters["re"] = RegexConverter @app.route("/sms/<re('1[3-9]\d{9}'):mobile>") def sms(mobile): return f"發(fā)送短信給手機(jī)號:{mobile}的用戶" @app.route("/goods/<re('\d+'):id>") def goods(id): return f"顯示商品id={id}的信息"
完整代碼,包含各種注釋解釋:
# 1. 導(dǎo)入flask核心類 from flask import Flask # 2. 初始化web應(yīng)用程序的實(shí)例對象 app = Flask(__name__) # 開啟debug模式 app.config["DEBUG"] = True """ 自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會單獨(dú)準(zhǔn)備一個python文件來保存轉(zhuǎn)換器的定義代碼] """ from werkzeug.routing.converters import BaseConverter #注意,自定義的類需要繼承BaseConverter,并且要重載父類初始化方法,初始化父類,接收re的參數(shù) class RegexConverter(BaseConverter): def __init__(self, map, *args, **kwargs): super().__init__(map, *args, **kwargs) self.regex = args[0] #中括號里面的值 re,就是我們在路由定義轉(zhuǎn)換器類時需要調(diào)用的 app.url_map.converters["re"] = RegexConverter #這個就是我們自定義的類 @app.route("/sms/<re('1[3-9]\d{9}'):mobile>") #這樣,每次路由在參數(shù)正則定義式,就作為參數(shù)傳給我們定義的類 def sms(mobile): return f"發(fā)送短信給手機(jī)號:{mobile}的用戶" @app.route("/goods/<re('\d+'):id>") #此時傳的是id的正則,只限制數(shù)字 def goods(id): return f"顯示商品id={id}的信息" if __name__ == '__main__': # 3. 運(yùn)行flask提供的測試web服務(wù)器程序 app.run(host="0.0.0.0", port=5000)
如果我們隨便輸入?yún)?shù),則訪問不到
輸入正確的手機(jī)號可以訪問到
發(fā)送正確的商品id,也可以訪問到
到此這篇關(guān)于有關(guān)flask路由app.route及路由參數(shù)的各種用法解析的文章就介紹到這了,更多相關(guān)flask路由app.route內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django項(xiàng)目單字段區(qū)間查詢的實(shí)現(xiàn)
在Django項(xiàng)目中會碰到一些需求就是查詢某個表中的一些字段從某日到某日的數(shù)據(jù),你可以像在SQL中那樣使用SELECT語句來查找指定字段,本文就來介紹兩種方法,感興趣的可以了解一下2023-10-10python類和函數(shù)中使用靜態(tài)變量的方法
這篇文章主要介紹了python類和函數(shù)中使用靜態(tài)變量的方法,實(shí)例分析了三種常用的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05python使用python-pptx刪除ppt某頁實(shí)例
今天小編就為大家分享一篇python使用python-pptx刪除ppt某頁實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02python pow函數(shù)的底層實(shí)現(xiàn)原理介紹
這篇文章主要介紹了python pow函數(shù)的底層實(shí)現(xiàn)原理介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03