?? 歡迎大家來到景天科技苑??
???? 養(yǎng)成好習(xí)慣,先贊后看哦~????
?? 作者簡(jiǎn)介:景天科技苑
??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。
??《博客》:Python全棧,前后端開發(fā),人工智能,js逆向,App逆向,網(wǎng)絡(luò)系統(tǒng)安全,數(shù)據(jù)分析,Django,fastapi,flask等框架,linux,shell腳本等實(shí)操經(jīng)驗(yàn),網(wǎng)站搭建,面試寶典等分享。所屬的專欄:flask框架零基礎(chǔ),進(jìn)階應(yīng)用實(shí)戰(zhàn)教學(xué)
景天的主頁:景天科技苑
flask路由
1.路由的基本定義
什么是路由?
路由就是一種映射關(guān)系。是綁定應(yīng)用程序(視圖)和url地址的一種一對(duì)一的映射關(guān)系!
我們?cè)陂_發(fā)過程中,編寫項(xiàng)目時(shí)所使用的路由往往是指代了框架/項(xiàng)目中用于完成路由功能的類,這個(gè)類一般就是路由類,簡(jiǎn)稱路由。
路由和視圖的名稱必須全局唯一,不能出現(xiàn)重復(fù),否則報(bào)錯(cuò)。
路由重復(fù),走先聲明的,視圖函數(shù)重復(fù)直接報(bào)錯(cuò)。
代碼示例:
# 1. 導(dǎo)入flask核心類
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開啟debug模式
app.config["DEBUG"] = True
# 參數(shù)1:rule設(shè)置當(dāng)前視圖的路由地址
# 參數(shù)2:methods,設(shè)置當(dāng)前視圖的HTTP請(qǐng)求方法,允許一個(gè)或多個(gè)方法,不區(qū)分大小寫,如果使用非設(shè)置的請(qǐng)求方法來訪問,會(huì)報(bào)405錯(cuò)誤
@app.route(rule="/", methods=["get", "post"])
def index():
return "<h1>hello flask1</h1>"
if __name__ == '__main__':
# 3. 運(yùn)行flask提供的測(cè)試web服務(wù)器程序
app.run(host="0.0.0.0", port=5000)
如下,使用非指定請(qǐng)求方法來訪問,會(huì)報(bào)錯(cuò)
使用postman來使用post請(qǐng)求
使用get請(qǐng)求測(cè)試,可以正常拿到響應(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í)例對(duì)象
app = Flask(__name__)
# 開啟debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
return "<h1>hello flask1</h1>"
"""
路由參數(shù)的傳遞
尖括號(hào)圈住,里面寫上參數(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提供的測(cè)試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文件中。底部可以看到以下字典:
在這個(gè)文件的最后配置
# converters用于對(duì)路由中的參數(shù)進(jìn)行格式轉(zhuǎn)換與類型限定的
t.Mapping[str, t.Type[BaseConverter]是為了告訴讀者,里面數(shù)據(jù)左邊是個(gè)字符串,右邊是數(shù)據(jù)類型
python3.6新增了一個(gè)typing模塊,讓我們?cè)诰帉憄ython代碼的變量時(shí),可以同時(shí)設(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)換器的注釋代碼中有寫,請(qǐng)留意每種轉(zhuǎn)換器初始化的參數(shù)。
代碼:
# 1. 導(dǎo)入flask核心類
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開啟debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
return "<h1>hello flask1</h1>"
"""
通過路由轉(zhuǎn)換器來對(duì)路由參數(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提供的測(cè)試web服務(wù)器程序
app.run(host="0.0.0.0", port=5000)
此時(shí)對(duì)于傳入非指定類型的參數(shù),則會(huì)報(bào)404錯(cuò)誤
傳指定類型參數(shù),才能正常訪問
3.自定義路由參數(shù)轉(zhuǎn)換器
也叫正則匹配路由參數(shù).
在 web 開發(fā)中,可能會(huì)出現(xiàn)限制用戶訪問規(guī)則的場(chǎng)景,那么這個(gè)時(shí)候就需要用到正則匹配,根據(jù)自己的規(guī)則去限定請(qǐng)求參數(shù)再進(jìn)行訪問
具體實(shí)現(xiàn)步驟為:
- 導(dǎo)入轉(zhuǎn)換器基類BaseConverter:在 Flask 中,所有的路由的匹配規(guī)則都是使用轉(zhuǎn)換器對(duì)象進(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í)例對(duì)象
app = Flask(__name__)
# 開啟debug模式
app.config["DEBUG"] = True
"""
自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)python文件來保存轉(zhuǎn)換器的定義代碼]
"""
from werkzeug.routing.converters import BaseConverter
#在我們自定義的類里面寫正則規(guī)則,并要繼承BaseConverter
class MobileConverter(BaseConverter):
"""手機(jī)號(hào)參數(shù)類型的轉(zhuǎn)換器"""
regex = r"1[3-9]\d{9}"
# 把自定義路由轉(zhuǎn)換器類注冊(cè)到flask項(xiàng)目中,中括號(hào)里面的參數(shù)我們下面路由轉(zhuǎn)換器類要用到
app.url_map.converters["mob"] = MobileConverter
@app.route("/sms/<mob:mobile>")
def sms(mobile):
return f"發(fā)送短信給手機(jī)號(hào):{mobile}的用戶"
if __name__ == '__main__':
# 3. 運(yùn)行flask提供的測(cè)試web服務(wù)器程序
app.run(host="0.0.0.0", port=5000)
運(yùn)行程序訪問,但凡不滿足正則規(guī)則的請(qǐng)求,都無法正常訪問
手機(jī)號(hào)太短
包含非數(shù)字
滿足正則要求的手機(jī)號(hào),可以正常訪問
但是這樣,我們寫個(gè)類就把正則規(guī)則定死了,不方便其他路由調(diào)用
因此,我們需要優(yōu)化,我們需要根據(jù)實(shí)際需要的正則來分別自定義
此時(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)換器使用時(shí)名字為: re
app.url_map.converters["re"] = RegexConverter
- 使用轉(zhuǎn)換器去實(shí)現(xiàn)自定義匹配規(guī)則,當(dāng)前此處定義的規(guī)則是:手機(jī)號(hào)碼
"""
自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)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ī)號(hào):{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í)例對(duì)象
app = Flask(__name__)
# 開啟debug模式
app.config["DEBUG"] = True
"""
自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)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]
#中括號(hào)里面的值 re,就是我們?cè)诼酚啥x轉(zhuǎn)換器類時(shí)需要調(diào)用的
app.url_map.converters["re"] = RegexConverter #這個(gè)就是我們自定義的類
@app.route("/sms/<re('1[3-9]\d{9}'):mobile>") #這樣,每次路由在參數(shù)正則定義式,就作為參數(shù)傳給我們定義的類
def sms(mobile):
return f"發(fā)送短信給手機(jī)號(hào):{mobile}的用戶"
@app.route("/goods/<re('\d+'):id>") #此時(shí)傳的是id的正則,只限制數(shù)字
def goods(id):
return f"顯示商品id={id}的信息"
if __name__ == '__main__':
# 3. 運(yùn)行flask提供的測(cè)試web服務(wù)器程序
app.run(host="0.0.0.0", port=5000)
如果我們隨便輸入?yún)?shù),則訪問不到
輸入正確的手機(jī)號(hào)可以訪問到文章來源:http://www.zghlxwxcb.cn/news/detail-841444.html
發(fā)送正確的商品id,也可以訪問到文章來源地址http://www.zghlxwxcb.cn/news/detail-841444.html
到了這里,關(guān)于有關(guān)flask路由app.route,路由參數(shù)的各種用法解析【非常全面】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!