最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)web應(yīng)用框架之增加動(dòng)態(tài)路由

 更新時(shí)間:2023年05月06日 09:58:24   作者:真的不能告訴你我的名字  
這篇文章主要介紹web應(yīng)用框架如何添加動(dòng)態(tài)路由,在我們編寫(xiě)的框架中,我們添加動(dòng)態(tài)路由,是使用了正則表達(dá)式,同時(shí)在注冊(cè)的時(shí)候,需要注明該路由是請(qǐng)求路由,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

今天我們將繼續(xù)對(duì)該框架進(jìn)行路由添加正則表達(dá)式。

本篇文章所依賴的python環(huán)境為:

路由添加正則表達(dá)式有什么用?

在介紹之前,我們首先要介紹一下Get獲取資源的時(shí)候,有如下幾種傳參方式:

  • 使用key...value 的形式,將參數(shù)放到url問(wèn)號(hào)?后面,如: http://127.0.0.1/userInfo?name=pdudo
  • url中以路徑參數(shù)的方式傳遞,例如: http://127.0.0.1/userInfo/pdudo/info。
  • 在請(qǐng)求頭中傳遞參數(shù),請(qǐng)求頭是以key...value的形式存儲(chǔ)的,當(dāng)然也可以自定義存放請(qǐng)求參數(shù)。

上述的第二種以路徑參數(shù)的方式傳參,就是我們這邊文章所描述的點(diǎn)。

為什么需要這樣做呢?

假設(shè)我們現(xiàn)在正在寫(xiě)一個(gè)功能,他需要返回傳上來(lái)的用戶信息,接口為: /userInfo/userid/infos,其中userid是動(dòng)態(tài)的,所以接口可以是/userInfo/c12345/infos,也可以是/userInfo/d33456/infos等等。

如果是這種情況,我們應(yīng)該怎么樣樣定義路由呢? 是在項(xiàng)目中給每個(gè)人都定義一個(gè)路由信息么?

很顯然不是的,如果這個(gè)時(shí)候,注冊(cè)的路由恰恰好是正則的,可以獲取客戶端傳上來(lái)的參數(shù),例如:/userInfo/pdudo/info,函數(shù)將會(huì)獲取pdudo,這樣不是很好么?

這就需要用到正則了。

如何定義動(dòng)態(tài)路由

由于我們此前已經(jīng)寫(xiě)好了定義靜態(tài)路由的相關(guān)方法,所以我們?cè)诙x動(dòng)態(tài)路由的時(shí)候,最好加一個(gè)識(shí)別參數(shù),告訴框架,這個(gè)路由是靜態(tài)的 還是 動(dòng)態(tài)的。

由于是動(dòng)態(tài)路由,所以在路由url中,有些值肯定是動(dòng)態(tài)的,如何在區(qū)別于靜態(tài)的值和動(dòng)態(tài)的值呢? 在該框架中,我們將動(dòng)態(tài)值用大括號(hào)括起來(lái),比如: /userInfo/{userID}/infos,其中userID是動(dòng)態(tài)的,可以是任何值組成,但是/userInfo/infos必須是靜態(tài)的,而且先后順序也是固定的。

所以說(shuō),我們可以約束一下,在定義動(dòng)態(tài)路由的時(shí)候,需要告訴框架,我這個(gè)是動(dòng)態(tài)路由,以及動(dòng)態(tài)url

所以我們準(zhǔn)備將動(dòng)態(tài)路由定義規(guī)劃如下:

@myWeb.routes(path="/jobs/{jobID}/startd",methods="post",regular=True)
def startJobs(r,cData):
    print("cData: " ,cData)

上述代碼,是我們即將完善功能后的代碼案例,其中regularTrue代表該路由是動(dòng)態(tài)的,path的值為/jobs/{jobID}/startd,其中jobID也是動(dòng)態(tài)的,可以被任何值代替。

最后是函數(shù)將接收2個(gè)參數(shù),r的值代表wsgi中的environ信息。 而cData則代表從客戶端上報(bào)的值,即:jobID的替代值。

注冊(cè)動(dòng)態(tài)路由

如上我們已經(jīng)約束好了一個(gè)動(dòng)態(tài)路由的添加規(guī)則,那么我們?nèi)绾巫?cè)動(dòng)態(tài)路由呢?

首先肯定的是,動(dòng)態(tài)路由肯定不能和靜態(tài)路由放在一起,所以我們定義了新的字典用于存放動(dòng)態(tài)路由的信息,如:

mapGetRegularRouting = {}
mapPostRegularRouting = {}

而后則是我們需要將注冊(cè)的路由信息轉(zhuǎn)換為正則表達(dá)式,這里舉個(gè)例子:

我們注冊(cè)的路由是這樣的: /jobs/{jobID}/startd,我們需要將其轉(zhuǎn)換為正則表達(dá)式,正則表達(dá)式的值是這樣的: ^/jobs/(.*?)/startd$。

關(guān)于這段正則表達(dá)式,它的含義是 匹配以/jobs/開(kāi)頭和/startd結(jié)尾的字符串,并且將匹配到的信息(.*的值)存儲(chǔ)到元組中。

注意這里.*后面的問(wèn)號(hào)?代表不啟用貪婪匹配,也就是最小化匹配。

現(xiàn)在的問(wèn)題是,如何將{jobsID}給轉(zhuǎn)換為(.*?)呢? 在python中,可以使用re.sub進(jìn)行替換操作,我們可以使用如下語(yǔ)句,將{jobsID}給替換為(.*?),代碼如下:

import re
print(re.sub("{.*?}","(.*?)","/jobs/{jobID}/startd"))

如上代碼執(zhí)行的結(jié)果為:

最后將該路由信息存儲(chǔ)到上述定義好的字典中即可,代碼片段如下:

reFindall = re.compile(r"{(.*?)}")
reSubAll = re.compile(r"{.*?}")

parameter = re.findall(reFindall,self.path)
reText = re.sub(reSubAll,"(.*?)",self.path)
reText = f"{reText}$"
regular = {
    "original": self.path,
    "reText": reText,
    "parameter": parameter,
    "func": func
}
# ...
if self.re:
    mapPostRegularRouting[regular["reText"]] = regular

至此,我們的動(dòng)態(tài)路由就已經(jīng)注冊(cè)好了。

匹配動(dòng)態(tài)路由

相比于注冊(cè)動(dòng)態(tài)路由,當(dāng)客戶端請(qǐng)求來(lái)了之后,匹配動(dòng)態(tài)路由會(huì)很麻煩,因?yàn)闆](méi)有請(qǐng)求報(bào)文不是告訴你,這是動(dòng)態(tài)路由還是靜態(tài)路由,所以說(shuō),匹配動(dòng)態(tài)路由很麻煩。

我們匹配動(dòng)態(tài)路由想到的時(shí)候笨辦法,即: 先匹配靜態(tài)路由,若靜態(tài)路由匹配不到,則再匹配動(dòng)態(tài)路由,若動(dòng)態(tài)路由都匹配不到的話,則選用默認(rèn)路由。

匹配靜態(tài)路由和動(dòng)態(tài)路由,前面篇章已經(jīng)介紹過(guò)了,所以這里不再贅述,這里就介紹如何匹配動(dòng)態(tài)路由。

所謂的動(dòng)態(tài)路由規(guī)則匹配,實(shí)際上就是拿著客戶端上傳的url,挨個(gè)對(duì)我們已有的正則表達(dá)式做輪訓(xùn),若匹配成功則退出循環(huán),若匹配失敗,最后就返回一個(gè)默認(rèn)路由即可,匹配正則表達(dá)式代碼如下:

for key in RegularRouting.keys():
    if re.match(key, path):
        isRegular = True
        collText = re.findall(key, path)
        func = RegularRouting[key]["func"]
        break
else:
    func = Route["/*"]

框架運(yùn)行效果展示

關(guān)于myWeb.py由于很長(zhǎng),有100多行,不好截圖,也不好純復(fù)制代碼了,所以放到了gitee上面:gitee.com/pdudo/golea…

我們簡(jiǎn)單寫(xiě)幾個(gè)demo測(cè)試一下web框架,代碼如下:

import myWeb
import wsgiref.simple_server

@myWeb.routes(path="/ip",methods="all")
def indx(r):
    print(r["REMOTE_ADDR"])
    return (200,r["REMOTE_ADDR"])

@myWeb.routes(path="/hello/{name}",methods="get",regular=True)
def helloWold(r,cData):
    name = cData[0]
    return (200,"hello %s" % (name))

def main():
    s = wsgiref.simple_server.make_server('', 8888, myWeb.application)
    s.serve_forever()

if __name__ == '__main__':
    main()

上述代碼,我們首先引入了myWebwsgiref模塊,前置是我們自己寫(xiě)的,后則是一個(gè)滿足wsgi服務(wù)器框架,在代碼中,我們定義了2個(gè)路由信息,一個(gè)是靜態(tài)路由,一個(gè)是動(dòng)態(tài)路由,其中靜態(tài)路由的函數(shù)是indx,路由信息是/ip,匹配的客戶端請(qǐng)求方法為get或者post,該方法主要返回ip地址。

動(dòng)態(tài)路由的函數(shù)則是helloWold,它將匹配到以/hello/為首的路由信息,匹配客戶端請(qǐng)求方法為get,還函數(shù)主要獲取用戶發(fā)送的動(dòng)態(tài)值,并且以hello 等返回給客戶端。

在主函數(shù)中,我們啟動(dòng)一個(gè)簡(jiǎn)單的wsgi服務(wù)器,入口為myWebapplication方法 。

代碼運(yùn)行效果如下:

我們分別使用getpost方法,請(qǐng)求本地/ip路由,可見(jiàn)都回復(fù)回來(lái)了,而后我們?cè)L問(wèn)/hello/pdudo/hello/juejin,他們也分別回復(fù)了hello pdudohello juejin。

總結(jié)

本篇文件介紹了將此前的web框架,路由修改為正則表達(dá)式形式,具體添加方式為: 在進(jìn)行路由注冊(cè)的時(shí)候,將其路由信息轉(zhuǎn)換為正則表達(dá)式,而在進(jìn)行路由匹配的時(shí)候,先匹配靜態(tài)服務(wù)器,若靜態(tài)服務(wù)器沒(méi)有,再進(jìn)行正則匹配,若正則匹配依然不行,則返回最后的默認(rèn)頁(yè)面。

以上就是python實(shí)現(xiàn)web應(yīng)用框架之增加動(dòng)態(tài)路由的詳細(xì)內(nèi)容,更多關(guān)于python增加動(dòng)態(tài)路由的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法

    python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法

    今天小編就為大家分享一篇python-opencv 將連續(xù)圖片寫(xiě)成視頻格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 運(yùn)行Python編寫(xiě)的程序方法實(shí)例

    運(yùn)行Python編寫(xiě)的程序方法實(shí)例

    在本篇文章里小編給大家整理了關(guān)于運(yùn)行Python編寫(xiě)的程序方法實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-10-10
  • 使用Python計(jì)算玩彩票贏錢概率

    使用Python計(jì)算玩彩票贏錢概率

    這篇文章主要介紹了玩彩票贏錢概率有多少?用Python來(lái)告訴你,需要的朋友可以參考下
    2019-06-06
  • python字符串加密解密的三種方法分享(base64 win32com)

    python字符串加密解密的三種方法分享(base64 win32com)

    這篇文章主要介紹了python字符串加密解密的三種方法,包括用base64、使用win32com.client、自己寫(xiě)的加密解密算法三種方法,大家參考使用吧
    2014-01-01
  • Python OpenCV實(shí)現(xiàn)測(cè)量圖片物體寬度

    Python OpenCV實(shí)現(xiàn)測(cè)量圖片物體寬度

    這篇文章主要介紹了Python OpenCV實(shí)現(xiàn)測(cè)量圖片物體寬度,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法

    Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法

    今天小編就為大家分享一篇Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python正則表達(dá)式(re模塊)的使用詳解

    python正則表達(dá)式(re模塊)的使用詳解

    正則表達(dá)式是用來(lái)匹配字符串非常強(qiáng)大的工具,在其他編程語(yǔ)言中同樣有正則表達(dá)式的概念,Python同樣不例外,下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式(re模塊)使用的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 在Linux系統(tǒng)上安裝Python的Scrapy框架的教程

    在Linux系統(tǒng)上安裝Python的Scrapy框架的教程

    這篇文章主要介紹了在Linux系統(tǒng)上安裝Python的Scrapy框架的教程,Scrapy是著名的專門針對(duì)搜索引擎的爬蟲(chóng)制作而研發(fā)的Python框架,需要的朋友可以參考下
    2015-06-06
  • python 實(shí)現(xiàn)端口掃描工具

    python 實(shí)現(xiàn)端口掃描工具

    這篇文章主要介紹了python 實(shí)現(xiàn)端口掃描工具的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 關(guān)于Django顯示時(shí)間你應(yīng)該知道的一些問(wèn)題

    關(guān)于Django顯示時(shí)間你應(yīng)該知道的一些問(wèn)題

    將Django項(xiàng)目部署到Linux系統(tǒng)上進(jìn)行測(cè)試時(shí),發(fā)現(xiàn)操作記錄的時(shí)間與服務(wù)器的時(shí)間不一致,相差13個(gè)小時(shí)。這主要是因?yàn)闀r(shí)區(qū)的問(wèn)題,下面這篇文章主要總結(jié)介紹了關(guān)于Django顯示時(shí)間你應(yīng)該知道的一些問(wèn)題,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

达尔| 永济市| 富川| 杂多县| 贵港市| 社会| 宝丰县| 景泰县| 蒙山县| 顺平县| 安吉县| 怀集县| 镇安县| 张家口市| 大新县| 金堂县| 大姚县| 涞源县| 教育| 安阳县| 合肥市| 阳谷县| 望江县| 吉安县| 简阳市| 麟游县| 奉新县| 交口县| 和田市| 洞口县| 穆棱市| 金平| 蒲江县| 全椒县| 合水县| 固原市| 连州市| 大连市| 宜良县| 湖州市| 普宁市|