Flask中'endpoint'(端點(diǎn))的理解

可以翻譯成“視圖入口”,就是個(gè)名字。url_for可以用到,其他方面也可以用到(比如導(dǎo)航條確定當(dāng)前頁(yè)面),因?yàn)閑ndpoint在一個(gè) app 里唯一對(duì)應(yīng)到一個(gè) view function。



翻譯整理自Stack Overflowhttp://stackoverflow.com/questions/19261833/what-is-an-endpoint-in-flask

原文中用到了my_greeting視圖函數(shù)/端點(diǎn),我估計(jì)是答者筆誤,故修改為了give_greeting。

Flask路由是如何工作的

整個(gè)flask框架(及以Werkzeug類庫(kù)為基礎(chǔ)構(gòu)建的應(yīng)用)的程序理念是把URL地址映射到你想要運(yùn)行的業(yè)務(wù)邏輯上(最典型的就是視圖函數(shù)),例如:

@app.route('/greeting/')defgive_greeting(name):return'Hello, {0}!'.format(name)

注意,add_url_rule函數(shù)實(shí)現(xiàn)了同樣的目的,只不過(guò)沒(méi)有使用裝飾器,因此,下面的程序是等價(jià)的:

# 抬頭沒(méi)有使用路由裝飾器,我們?cè)谧詈笥昧硪环N方法添加路由.defgive_greeting(name):return'Hello, {0}!'.format(name)app.add_url_rule('/greeting/','give_greeting', give_greeting)

備注:add_url_rule()中3個(gè)參數(shù)依次是ruleview_funcendpoint.

假設(shè)www.example.org站點(diǎn)定義了以上視圖,用戶在瀏覽器中輸入以下地址

http://www.example.org/greeting/Mark

Flask的工作就是捕捉這個(gè)URL地址,弄清用戶想要做什么,并在眾多的Python函數(shù)中匹配一個(gè)可以處理它的函數(shù),回到我們的實(shí)例中,URL地址就是

/greeting/Mark

拿著這個(gè)地址到路由表中做匹配,flask發(fā)現(xiàn)這個(gè)地址指向了give_greeting函數(shù)。

然而,當(dāng)我們用這種最常用的方法創(chuàng)建視圖時(shí),flask卻向我們隱藏了一些其他的細(xì)節(jié)信息。在這個(gè)場(chǎng)景中,flask并沒(méi)有直接從URL地址跳轉(zhuǎn)到應(yīng)該響應(yīng)它請(qǐng)求的視圖函數(shù)上:

URL (http://www.example.org/greeting/Mark) 被視圖函數(shù)處理 ("give_greeting"函數(shù))

事實(shí)上,這里還有另一個(gè)步驟--把URL地址映射到端點(diǎn)上(URL-->endpoint-->viewfunction):

URL (http://www.example.org/greeting/Mark) 映射到端點(diǎn)"give_greeting"上.指向端點(diǎn)"give_greeting"的請(qǐng)求被視圖函數(shù)"give_greeting"處理.

從根本上來(lái)說(shuō),端點(diǎn)就是程序中一組邏輯處理單元的ID,該ID對(duì)應(yīng)的代碼決定了對(duì)此ID請(qǐng)求應(yīng)該作出何種響應(yīng)。通常,端點(diǎn)與視圖函數(shù)同名,但是你也可以修改它,例如:

@app.route('/greeting/', endpoint='say_hello')defgive_greeting(name):return'Hello, {0}!'.format(name)

現(xiàn)在就成了這樣:

URL (http://www.example.org/greeting/Mark) 映射到端點(diǎn)"say_hello"上.指向端點(diǎn)"say_hello"的請(qǐng)求被視圖函數(shù)"give_greeting"處理.

Endpoint有什么作用

端點(diǎn)通常用作反向查詢URL地址(viewfunction-->endpoint-->URL)。例如,在flask中有個(gè)視圖,你想把它關(guān)聯(lián)到另一個(gè)視圖上(或從站點(diǎn)的一處連接到另一處)。不用去千辛萬(wàn)苦的寫它對(duì)應(yīng)的URL地址,直接使用URL_for()就可以啦:

@app.route('/')def index():? ? print url_for('give_greeting', name='Mark') # 打印出'/greeting/Mark'@app.route('/greeting/')def give_greeting(name):? ? return'Hello, {0}!'.format(name)

備注:url_for()中g(shù)ive_greeting是端點(diǎn)名.

這樣做是大有裨益的:我們可以隨意改變應(yīng)用中的URL地址,卻不用修改與之關(guān)聯(lián)的資源的代碼。

為何要多此一舉

那么問(wèn)題來(lái)了:為何要多此一舉,為何要先把URL映射到端點(diǎn)上,再通過(guò)端點(diǎn)映射到視圖函數(shù)上,為何不跳過(guò)中間的這個(gè)步驟?

原因就是采用這種方法能夠使程序更高、更快、更強(qiáng)。例如藍(lán)本。藍(lán)本允許我們把應(yīng)用分割為一個(gè)個(gè)小的部分,現(xiàn)在admin藍(lán)本中含有超級(jí)管理員級(jí)的資源,user藍(lán)本中則含有用戶一級(jí)的資源。

藍(lán)本允許咱們把應(yīng)用分割為一個(gè)個(gè)以命名空間區(qū)分的小部分:

main.py:

fromflaskimportFlask, Blueprintfromadminimportadminfromuserimportuserapp = Flask(__name__)app.register_blueprint(admin, url_prefix='admin')app.register_blueprint(user, url_prefix='user')

admin.py:

admin = Blueprint('admin', __name__)@admin.route('/greeting')defgreeting():return'Hello, administrative user!'

user.py:

user = Blueprint('user', __name__)@user.route('/greeting')defgreeting():return'Hello, lowly normal user!'

注意,在兩個(gè)藍(lán)本中路由地址'/greeting'的函數(shù)都叫"greeting"。如果我想調(diào)用admin對(duì)應(yīng)的greeting函數(shù),我不能說(shuō)“我想要greeting”,因?yàn)檫@里還有一個(gè)user對(duì)應(yīng)的greeting函數(shù)。端點(diǎn)這時(shí)就發(fā)揮作用了:指定一個(gè)藍(lán)本名稱作為端點(diǎn)的一部分--通過(guò)這種方式端點(diǎn)實(shí)現(xiàn)了對(duì)命名空間的支持。所以,我們可以這樣寫:

printurl_for('admin.greeting') # Prints'/admin/greeting'printurl_for('user.greeting') # Prints'/user/greeting'

來(lái)發(fā)實(shí)例

fromflaskimportFlask, url_forapp = Flask(__name__)# We can use url_for('foo_view') for reverse-lookups in templates or view functions@app.route('/foo')deffoo_view():pass# We now specify the custom endpoint named 'bufar'. url_for('bar_view') will fail!@app.route('/bar', endpoint='bufar')defbar_view():passwithapp.test_request_context('/'):print(url_for('foo_view'))#/fooprint(url_for('bufar'))#/bar# url_for('bar_view') will raise werkzeug.routing.BuildErrorprint(url_for('bar_view'))#端點(diǎn)bar_view是沒(méi)有定義的

程序運(yùn)行結(jié)果

python_endpoint_程序運(yùn)行結(jié)果

更多參考:

http://www.cnblogs.com/eric-nirnava/p/endpoint.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,069評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,873評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,128評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,365評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,582評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,821評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,595評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評(píng)論 2 372

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

  • Flask中'endpoint'(端點(diǎn))的理解 翻譯整理自Stack Overflow:http://stacko...
    摩訶婆羅多閱讀 9,265評(píng)論 4 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評(píng)論 18 139
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,200評(píng)論 22 257
  • 在flask框架中,我們經(jīng)常會(huì)遇到endpoint這個(gè)東西,最開(kāi)始也沒(méi)法理解這個(gè)到底是做什么的。最近正好在研究Fl...
    卡薩諾瓦_(dá)閱讀 969評(píng)論 0 0
  • 現(xiàn)在的大型連鎖超市真的不少,全國(guó)性甚至全球性的家樂(lè)福,沃爾瑪,地方性的嘉榮,中百倉(cāng)儲(chǔ),大潤(rùn)發(fā),百佳,大型商場(chǎng)標(biāo)配的...
    三十二月閱讀 1,046評(píng)論 0 0