在我上一篇文章,我搭了一個(gè)框架,模擬了Flask網(wǎng)站上“@app.route(‘/')”第一條例子的行為。
如果你錯(cuò)過了那篇“這不是魔法”,請(qǐng)點(diǎn)擊這里。
在這篇文章中,我們打算稍微調(diào)高點(diǎn)難度,為我們的URL加入可變參數(shù)的能力,在本文的最后,我們將支持下述代碼段所期望達(dá)到的行為。
app = Flask(__name__) @app.route("/hello/<username>")def hello_user(username): return "Hello {}!".format(username)這樣下面的路徑實(shí)例(path):
/hello/ains
將會(huì)匹配上面的路徑,給我們的輸出為
Hello ains!
以正則的形式表達(dá)我們的路徑。
現(xiàn)在我們將允許我們的URL動(dòng)態(tài)變化,我們不再能夠?qū)⒂孟惹笆褂谩癅app.route()”注冊(cè)的路徑直接與路徑實(shí)例比較。
我們將用什么替代?我們需要用上正則表達(dá)式,這樣我們就可以將路徑作為一種模式進(jìn)行匹配,而不和一條固定的字符串比較了。
我不打算在本文展開討論正則表達(dá)式的細(xì)節(jié),不過如果你需要一份復(fù)習(xí)資料,可以點(diǎn)擊這個(gè)網(wǎng)站。
那么,我們的第一步是將我們的路徑轉(zhuǎn)化成正則表達(dá)式模式,這樣我們就能在輸入路徑實(shí)例時(shí)進(jìn)行匹配。我們也將使用這個(gè)正則表達(dá)式提取我們感興趣的變量。
那么,匹配路徑”/hello/”的正則表達(dá)式該長(zhǎng)啥樣呢?
嗯一個(gè)簡(jiǎn)單的正則表達(dá)式譬如“^/hello/(.+)$”將是個(gè)好的開始,讓我們一起看看它和代碼是怎么一起工作的:
import re route_regex = re.compile(r"^/hello/(.+)$")match = route_regex.match("/hello/ains") print match.groups()將會(huì)輸出:
('ains',)
不錯(cuò),不過,理想情況是我們想要維護(hù)我們已經(jīng)匹配上的第一組鏈接,并且從路徑“/hello/”識(shí)別出“username”。
命名捕獲組
幸運(yùn)的是,正則表達(dá)式也支持命名捕獲組,允許我們給匹配組分配一個(gè)名字,我們能在讀取我們的匹配之后找回它。
我們可以使用下述符號(hào),給出第一個(gè)例子識(shí)別“username”的捕獲組。
/hello/(<?P<username>.+)"
然后我們可以對(duì)我們的正則表達(dá)式使用groupdict()方法,將所有捕獲組當(dāng)作一個(gè)字典,組的名字對(duì)應(yīng)匹配上的值。
那么我們給出下述代碼:
route_regex = re.compile(r'^/hello/(?P<username>.+)$')match = route_regex.match("/hello/ains") print match.groupdict()將為我們輸出以下字典:
{'username': 'ains'}
現(xiàn)在,有了我們所需要的正則表達(dá)式的格式,以及如何使用它們?nèi)テヅ漭斎氲腢RLs的知識(shí),最后剩下的是寫一個(gè)方法,將我們聲明的路徑轉(zhuǎn)換成它們等價(jià)的正則表達(dá)式模式。
新聞熱點(diǎn)
疑難解答
圖片精選