Flask中的橋梁:路由

何為路由被丧?

顧名思義就是一條路徑鸿染,這條路引領(lǐng) url 從瀏覽器到WSGI服務(wù)器酸休,然后將處理結(jié)果返回到Browser。在 Flask 框架中 洋访,路由的作用就是為用戶請(qǐng)求的URL找出其對(duì)應(yīng)的處理函數(shù) 镣陕。

1. 注冊(cè)路由

Flask 框架中: 根據(jù)HTTP請(qǐng)求的URL在路由表中尋找對(duì)應(yīng)的URL規(guī)則,找到對(duì)應(yīng)的視圖函數(shù)姻政,并將視圖函數(shù)的執(zhí)行結(jié)果返回給WSGI服務(wù)器呆抑。注:Flask封裝了一個(gè)簡(jiǎn)單的開(kāi)發(fā)用的WSGI服務(wù)器,調(diào)用run函數(shù)時(shí)汁展,該服務(wù)器啟動(dòng)鹊碍。

其實(shí),在Flask里邊有一個(gè)中轉(zhuǎn)的機(jī)制---------endpoint

在Flask內(nèi)部使用兩張表維護(hù)路由:
url_map:維護(hù)URL規(guī)則和endpoint的映射
view_functions:維護(hù)endpoint和視圖函數(shù)的映射食绿。
默認(rèn)訪問(wèn)點(diǎn) :當(dāng)我們使用route裝飾器注冊(cè)路由時(shí)妹萨,默認(rèn)使用被裝飾函數(shù)的 函數(shù)名(name)作為訪問(wèn)點(diǎn)。
自定義訪問(wèn)點(diǎn) :可以在使用route裝飾器或調(diào)用add_url_rule()方法注冊(cè)路由時(shí)炫欺,使用 endpoint關(guān)鍵字參數(shù)改變這一默認(rèn)行為乎完。

@app.route('/test',endpoint='self_define')
     def test():pass
2. 兩種路由方式
① 調(diào)用 add_url_route() 為函數(shù)指定一個(gè)路由
def test():
    return 'this is test'
app.add_url_route('/test',view_func=test)
② 用 route 裝飾器將一個(gè)url規(guī)則綁定到一個(gè)視圖函數(shù)上
@app.route('/test')
def test():
    return 'this is test'
顯然, 使用裝飾器讓代碼看起來(lái)更加的簡(jiǎn)潔明了
3. 動(dòng)態(tài)路由

要給 URL 添加變量部分品洛,你可以把這些特殊的字段標(biāo)記為 <variable_name> 树姨, 這個(gè)部分將會(huì)作為命名參數(shù)傳遞到你的函數(shù)摩桶。規(guī)則可以用 <converter:variable_name> 指定一個(gè)可選的轉(zhuǎn)換器

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

轉(zhuǎn)換器有下面幾種:
int 接受整數(shù)
float 接受浮點(diǎn)數(shù)
path 和默認(rèn)的相似,但接受斜線
這里解釋一下

目錄結(jié)構(gòu)

假如我們要訪問(wèn)四個(gè)文件帽揪,目錄結(jié)構(gòu)如上圖所示

@app.route('/file/<fname>')
def v_file(fname):
    fullname = os.path.join('/A/B',fname)
    f = open(fullname)
    content =  f.read()
    f.close()
    return cnt

測(cè)試結(jié)果表明硝清,/file/a.txt和/file/b.txt都沒(méi)有問(wèn)題,但是/file/C/c.txt和 /file/C/d.txt卻會(huì)失敗转晰。
這是因?yàn)槁茫J(rèn)情況下,在URL規(guī)則中的變量被視為不包含/的字符串查邢。/file/C/c.txt 是沒(méi)有辦法匹配URL規(guī)則/file/的蔗崎。

如果這里改為path,則四個(gè)文件都可以訪問(wèn)到
@app.route('/file/<path:fname>')
def v_file(fname):
    fullname = os.path.join('/A/B',fname)
    f = open(fullname)
    content =  f.read()
    f.close()
    return cnt
4. 添加HTTP方法

HTTP有許多不同的訪問(wèn) URL 方法扰藕。默認(rèn)情況下缓苛,路由只回應(yīng) GET 請(qǐng)求,但是通過(guò) route() 裝飾器傳遞 methods 參數(shù)可以改變這個(gè)行為邓深。例如:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()
5. 靜態(tài)目錄路由

當(dāng)創(chuàng)建應(yīng)用實(shí)例時(shí)未桥,F(xiàn)lask將自動(dòng)添加一條靜態(tài)目錄路由,其訪問(wèn)點(diǎn) 始終被設(shè)置為static芥备,URL規(guī)則默認(rèn)被設(shè)置為/static冬耿,本地路徑默認(rèn)被 設(shè)置為應(yīng)用文件夾下的static子文件夾

改變默認(rèn)的本地路徑 :可以在創(chuàng)建應(yīng)用對(duì)象時(shí)使用關(guān)鍵字參數(shù)static_folder改變 默認(rèn)的靜態(tài)文件夾。例如萌壳,你的靜態(tài)文件都存放在應(yīng)用下的assets目錄下亦镶, 那么可以按如下的方式創(chuàng)建應(yīng)用對(duì)象:

app = Flask(name,static_folder='assets') 
6. url_for函數(shù)

url_for() 函數(shù)最簡(jiǎn)單的用法是以視圖函數(shù)名(或者app.add_url_route() 定義路由時(shí)使用的端點(diǎn)名)作為參數(shù),返回對(duì)應(yīng)的URL讶凉。例如染乌,在當(dāng)前程序中調(diào)用url_for('index') 得到的結(jié)果是/。調(diào)用url_for('index', _external=True) 返回的則是絕對(duì)地址懂讯,在這個(gè)示例中是http://localhost:5000/

參數(shù)分別是 視圖函數(shù) 荷憋、變量、參數(shù)

print url_for('A',name='B',format='c')

輸出

A/B?format=c

下面這個(gè)使用_anchor關(guān)鍵字可以為生成的URL添加錨點(diǎn)

print url_for('A',_anchor='d')

輸出

/A#d

使用 render_template() 方法來(lái)渲染模板褐望。Flask 會(huì)在 templates 文件夾里尋找模板勒庄。

@main.route('/', methods=['GET', 'POST'])
def index():
    return render_template('main/index.html')

這里不再細(xì)講,url_for函數(shù)有其他功能瘫里,
1. 傳入url_for() 的關(guān)鍵字參數(shù)不僅限于動(dòng)態(tài)路由中的參數(shù)实蔽。函數(shù)能將任何額外參數(shù)添加到查詢字符串中。例如谨读,url_for('index', page=2) 的返回結(jié)果是/?page=2局装。
2 通過(guò) 路由.視圖函數(shù) 可以定位到其他界面,例如

<a href="{{ url_for('main.index') }}">首頁(yè)</a>
OK, Flask 路由的基本內(nèi)容就這些铐尚,作為橋梁拨脉,其實(shí)路由在web項(xiàng)目的作用舉足輕重!
謝謝您的瀏覽宣增,還點(diǎn)了喜歡
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玫膀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爹脾,更是在濱河造成了極大的恐慌帖旨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵妨,死亡現(xiàn)場(chǎng)離奇詭異解阅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闷串,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)瓮钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筋量,“玉大人烹吵,你說(shuō)我怎么就攤上這事〗拔洌” “怎么了肋拔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呀酸。 經(jīng)常有香客問(wèn)我凉蜂,道長(zhǎng),這世上最難降的妖魔是什么性誉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任窿吩,我火速辦了婚禮,結(jié)果婚禮上错览,老公的妹妹穿的比我還像新娘纫雁。我一直安慰自己,他們只是感情好倾哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布轧邪。 她就那樣靜靜地躺著,像睡著了一般羞海。 火紅的嫁衣襯著肌膚如雪忌愚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天却邓,我揣著相機(jī)與錄音硕糊,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛简十,可吹牛的內(nèi)容都是我干的衙耕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勺远,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橙喘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胶逢,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厅瞎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后初坠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體和簸,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催式,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年届巩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狮杨。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡半沽,死狀恐怖爽柒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情者填,我是刑警寧澤浩村,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站占哟,受9級(jí)特大地震影響心墅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榨乎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一怎燥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜜暑,春花似錦铐姚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至篇梭,卻和暖如春氢橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恬偷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工悍手, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓坦康,卻偏偏與公主長(zhǎng)得像竣付,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滞欠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停古胆,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,169評(píng)論 22 257
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)筛璧,斷路器逸绎,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • [TOC]一直想做源碼閱讀這件事,總感覺(jué)難度太高時(shí)間太少夭谤,可望不可見(jiàn)棺牧。最近正好時(shí)間充裕,決定試試做一下朗儒,并記錄一下...
    何柯君閱讀 7,177評(píng)論 3 98
  • 在flask框架中颊乘,我們經(jīng)常會(huì)遇到endpoint這個(gè)東西,最開(kāi)始也沒(méi)法理解這個(gè)到底是做什么的醉锄。最近正好在研究Fl...
    卡薩諾瓦_(dá)閱讀 940評(píng)論 0 0
  • 花間新雨后乏悄,花畔故人前。 小徑香浮動(dòng)榆鼠,來(lái)客獨(dú)流連纲爸。 清游復(fù)今日亥鸠,豪興勝去年妆够。 相望飛燕子,有待蝶聯(lián)翩负蚊。 幾許心頭憶...
    雪窗_武立之閱讀 210評(píng)論 1 4