欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于flask路由app.route及路由參數(shù)的各種用法解析

 更新時(shí)間:2024年03月22日 09:42:48   作者:景天科技苑  
我們?cè)陂_(kāi)發(fā)過(guò)程中,編寫(xiě)項(xiàng)目時(shí)所使用的路由往往是指代了框架/項(xiàng)目中用于完成路由功能的類(lèi),這個(gè)類(lèi)一般就是路由類(lèi),簡(jiǎn)稱(chēng)路由,這篇文章主要介紹了有關(guān)flask路由app.route及路由參數(shù)的各種用法解析,需要的朋友可以參考下

flask路由

1.路由的基本定義

什么是路由?

路由就是一種映射關(guān)系。是綁定應(yīng)用程序(視圖)和url地址的一種一對(duì)一的映射關(guān)系!
我們?cè)陂_(kāi)發(fā)過(guò)程中,編寫(xiě)項(xiàng)目時(shí)所使用的路由往往是指代了框架/項(xiàng)目中用于完成路由功能的類(lèi),這個(gè)類(lèi)一般就是路由類(lèi),簡(jiǎn)稱(chēng)路由。

路由和視圖的名稱(chēng)必須全局唯一,不能出現(xiàn)重復(fù),否則報(bào)錯(cuò)。
路由重復(fù),走先聲明的,視圖函數(shù)重復(fù)直接報(bào)錯(cuò)。

代碼示例:

# 1. 導(dǎo)入flask核心類(lèi)
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開(kāi)啟debug模式
app.config["DEBUG"] = True
# 參數(shù)1:rule設(shè)置當(dāng)前視圖的路由地址
# 參數(shù)2:methods,設(shè)置當(dāng)前視圖的HTTP請(qǐng)求方法,允許一個(gè)或多個(gè)方法,不區(qū)分大小寫(xiě),如果使用非設(shè)置的請(qǐng)求方法來(lái)訪問(wèn),會(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)求方法來(lái)訪問(wèn),會(huì)報(bào)錯(cuò)

使用postman來(lái)使用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核心類(lèi)
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開(kāi)啟debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
    return "<h1>hello flask1</h1>"
"""
路由參數(shù)的傳遞
尖括號(hào)圈住,里面寫(xiě)上參數(shù)變量名
在視圖中即可通過(guò)參數(shù)列表按命名來(lái)接收
接收參數(shù)時(shí),如果沒(méi)有在設(shè)置路由中設(shè)置參數(shù)的類(lèi)型,則默認(rèn)參數(shù)類(lèi)型為字符串類(lèi)型
"""
@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)

瀏覽器訪問(wèn),拿到url輸入的數(shù)據(jù)

2.接收限定類(lèi)型參數(shù)

限定路由參數(shù)的類(lèi)型,flask系統(tǒng)自帶轉(zhuǎn)換器編寫(xiě)在werkzeug/routing/converters.py文件中。底部可以看到以下字典:

在這個(gè)文件的最后配置

# converters用于對(duì)路由中的參數(shù)進(jìn)行格式轉(zhuǎn)換與類(lèi)型限定的
 t.Mapping[str, t.Type[BaseConverter]是為了告訴讀者,里面數(shù)據(jù)左邊是個(gè)字符串,右邊是數(shù)據(jù)類(lèi)型
python3.6新增了一個(gè)typing模塊,讓我們?cè)诰帉?xiě)python代碼的變量時(shí),可以同時(shí)設(shè)置變量的數(shù)據(jù)類(lèi)型
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {
    "default": UnicodeConverter, # 默認(rèn)類(lèi)型,也就是string
    "string": UnicodeConverter, # 字符串,不包含 /
    "any": AnyConverter,    # 任意類(lèi)型
    "path": PathConverter,  # 也是字符串,但是包含了 /
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}

系統(tǒng)自帶的轉(zhuǎn)換器具體使用方式在每種轉(zhuǎn)換器的注釋代碼中有寫(xiě),請(qǐng)留意每種轉(zhuǎn)換器初始化的參數(shù)。

代碼:

# 1. 導(dǎo)入flask核心類(lèi)
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開(kāi)啟debug模式
app.config["DEBUG"] = True
@app.route(rule="/", methods=["get", "post"])
def index():
    return "<h1>hello flask1</h1>"
"""
通過(guò)路由轉(zhuǎn)換器來(lái)對(duì)路由參數(shù)顯示格式轉(zhuǎn)換和限制類(lèi)型
"""
@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ì)于傳入非指定類(lèi)型的參數(shù),則會(huì)報(bào)404錯(cuò)誤

傳指定類(lèi)型參數(shù),才能正常訪問(wèn)

3.自定義路由參數(shù)轉(zhuǎn)換器

也叫正則匹配路由參數(shù).

在 web 開(kāi)發(fā)中,可能會(huì)出現(xiàn)限制用戶(hù)訪問(wèn)規(guī)則的場(chǎng)景,那么這個(gè)時(shí)候就需要用到正則匹配,根據(jù)自己的規(guī)則去限定請(qǐng)求參數(shù)再進(jìn)行訪問(wèn)

具體實(shí)現(xiàn)步驟為:

  • 導(dǎo)入轉(zhuǎn)換器基類(lèi)BaseConverter:在 Flask 中,所有的路由的匹配規(guī)則都是使用轉(zhuǎn)換器對(duì)象進(jìn)行記錄
  • 自定義轉(zhuǎn)換器:自定義類(lèi)繼承于轉(zhuǎn)換器基類(lèi)BaseConverter
  • 添加轉(zhuǎn)換器到默認(rèn)的轉(zhuǎn)換器字典DEFAULT_CONVERTERS中
  • 使用自定義轉(zhuǎn)換器實(shí)現(xiàn)自定義匹配規(guī)則

代碼實(shí)現(xiàn)

# 1. 導(dǎo)入flask核心類(lèi)
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開(kāi)啟debug模式
app.config["DEBUG"] = True
"""
自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)python文件來(lái)保存轉(zhuǎn)換器的定義代碼]
"""
from werkzeug.routing.converters import BaseConverter
#在我們自定義的類(lèi)里面寫(xiě)正則規(guī)則,并要繼承BaseConverter
class MobileConverter(BaseConverter):
    """手機(jī)號(hào)參數(shù)類(lèi)型的轉(zhuǎn)換器"""
    regex = r"1[3-9]\d{9}"
# 把自定義路由轉(zhuǎn)換器類(lèi)注冊(cè)到flask項(xiàng)目中,中括號(hào)里面的參數(shù)我們下面路由轉(zhuǎn)換器類(lèi)要用到
app.url_map.converters["mob"] = MobileConverter
@app.route("/sms/<mob:mobile>")
def sms(mobile):
    return f"發(fā)送短信給手機(jī)號(hào):{mobile}的用戶(hù)"
if __name__ == '__main__':
    # 3. 運(yùn)行flask提供的測(cè)試web服務(wù)器程序
    app.run(host="0.0.0.0", port=5000)

運(yùn)行程序訪問(wèn),但凡不滿(mǎn)足正則規(guī)則的請(qǐng)求,都無(wú)法正常訪問(wèn)
手機(jī)號(hào)太短

包含非數(shù)字

滿(mǎn)足正則要求的手機(jī)號(hào),可以正常訪問(wèn)

但是這樣,我們寫(xiě)個(gè)類(lèi)就把正則規(guī)則定死了,不方便其他路由調(diào)用
因此,我們需要優(yōu)化,我們需要根據(jù)實(shí)際需要的正則來(lái)分別自定義
此時(shí),我們需要將正則作為參數(shù)傳進(jìn)去

導(dǎo)入轉(zhuǎn)換器基類(lèi)
from werkzeug.routing.converters import BaseConverter

自定義轉(zhuǎn)換器
先看下父類(lèi)

class RegexConverter(BaseConverter):
    def __init__(self, map, *args, **kwargs):
        super().__init__(map, *args, **kwargs)  #我們不用進(jìn)行類(lèi)型限定
        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)目開(kāi)發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)python文件來(lái)保存轉(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}的用戶(hù)"
@app.route("/goods/<re('\d+'):id>")
def goods(id):
    return f"顯示商品id={id}的信息"

完整代碼,包含各種注釋解釋?zhuān)?/p>

# 1. 導(dǎo)入flask核心類(lèi)
from flask import Flask
# 2. 初始化web應(yīng)用程序的實(shí)例對(duì)象
app = Flask(__name__)
# 開(kāi)啟debug模式
app.config["DEBUG"] = True
"""
自定義路由轉(zhuǎn)換[在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們會(huì)單獨(dú)準(zhǔn)備一個(gè)python文件來(lái)保存轉(zhuǎn)換器的定義代碼]
"""
from werkzeug.routing.converters import BaseConverter
#注意,自定義的類(lèi)需要繼承BaseConverter,并且要重載父類(lèi)初始化方法,初始化父類(lèi),接收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)換器類(lèi)時(shí)需要調(diào)用的
app.url_map.converters["re"] = RegexConverter   #這個(gè)就是我們自定義的類(lèi)
@app.route("/sms/<re('1[3-9]\d{9}'):mobile>")  #這樣,每次路由在參數(shù)正則定義式,就作為參數(shù)傳給我們定義的類(lèi)
def sms(mobile):
    return f"發(fā)送短信給手機(jī)號(hào):{mobile}的用戶(hù)"
@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ù),則訪問(wèn)不到

輸入正確的手機(jī)號(hào)可以訪問(wèn)到

發(fā)送正確的商品id,也可以訪問(wèn)到

到此這篇關(guān)于有關(guān)flask路由app.route及路由參數(shù)的各種用法解析的文章就介紹到這了,更多相關(guān)flask路由app.route內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django項(xiàng)目單字段區(qū)間查詢(xún)的實(shí)現(xiàn)

    Django項(xiàng)目單字段區(qū)間查詢(xún)的實(shí)現(xiàn)

    在Django項(xiàng)目中會(huì)碰到一些需求就是查詢(xún)某個(gè)表中的一些字段從某日到某日的數(shù)據(jù),你可以像在SQL中那樣使用SELECT語(yǔ)句來(lái)查找指定字段,本文就來(lái)介紹兩種方法,感興趣的可以了解一下
    2023-10-10
  • python類(lèi)和函數(shù)中使用靜態(tài)變量的方法

    python類(lèi)和函數(shù)中使用靜態(tài)變量的方法

    這篇文章主要介紹了python類(lèi)和函數(shù)中使用靜態(tài)變量的方法,實(shí)例分析了三種常用的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • Python3爬蟲(chóng)帶上cookie的實(shí)例代碼

    Python3爬蟲(chóng)帶上cookie的實(shí)例代碼

    在本篇文章里小編給各位分享的是一篇關(guān)于Python3爬蟲(chóng)帶上cookie的實(shí)例代碼內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • 解決python虛擬環(huán)境切換無(wú)效的問(wèn)題

    解決python虛擬環(huán)境切換無(wú)效的問(wèn)題

    這篇文章主要介紹了解決python虛擬環(huán)境切換無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python使用python-pptx刪除ppt某頁(yè)實(shí)例

    python使用python-pptx刪除ppt某頁(yè)實(shí)例

    今天小編就為大家分享一篇python使用python-pptx刪除ppt某頁(yè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python字符串與正則表達(dá)式詳細(xì)介紹

    Python字符串與正則表達(dá)式詳細(xì)介紹

    這篇文章主要介紹了Python字符串與正則表達(dá)式,Python字符串與正則表達(dá)式在Python中具有非常重要的地位,熟練的使用字符串與正則表達(dá)式能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • python的re模塊應(yīng)用實(shí)例

    python的re模塊應(yīng)用實(shí)例

    這篇文章主要介紹了python的re模塊應(yīng)用實(shí)例,包括了常見(jiàn)的正則匹配技巧,需要的朋友可以參考下
    2014-09-09
  • python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼

    python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲(chóng)判斷招聘信息是否存在的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • Python多進(jìn)程原理與用法分析

    Python多進(jìn)程原理與用法分析

    這篇文章主要介紹了Python多進(jìn)程原理與用法,結(jié)合實(shí)例形式分析了Python多進(jìn)程原理、開(kāi)啟使用進(jìn)程、進(jìn)程隊(duì)列、進(jìn)程池等相關(guān)概念與使用方法,需要的朋友可以參考下
    2018-08-08
  • python pow函數(shù)的底層實(shí)現(xiàn)原理介紹

    python pow函數(shù)的底層實(shí)現(xiàn)原理介紹

    這篇文章主要介紹了python pow函數(shù)的底層實(shí)現(xiàn)原理介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03

最新評(píng)論