Flask里的endpoint是什么尘盼?

本文譯自: https://stackoverflow.com/questions/19261833/what-is-an-endpoint-in-flask

Flask官方文檔中:

add_url_rule(*args, **kwargs)
      Connects a URL rule. Works exactly like the route() decorator.
      If a view_func is provided it will be registered with the endpoint.

     endpoint – the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint

那么什么是 endpoint 呢肖油?

Flask中路由Routing的工作方式

Flask(和底層的Werkzeug庫)的基本思想是將URL路徑映射到一些你將運(yùn)行的邏輯(通常是“視圖函數(shù)”)兼吓。 通常你的視圖函數(shù)是這樣定義的:

@app.route('/greeting/<name>')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

注意函數(shù) add_url_rule 也實現(xiàn)了相同的目標(biāo),只是不使用裝飾器森枪。 所以下面是一樣的:

# No "route" decorator here. We will add routing using a different method below.
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

app.add_url_rule('/greeting/<name>', 'give_greeting', give_greeting)

假設(shè)你的網(wǎng)站位于“www.example.org”并使用上述視圖视搏。 用戶在瀏覽器中輸入以下URL:

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

Flask的工作是獲取這個URL审孽,找出用戶想要做的事情,然后把它傳遞給你眾多python函數(shù)中的一個來處理浑娜。 它采取的路徑是:

/greeting/Mark

并將其匹配到路由列表佑力。 在我們的例子中,我們定義了這個路徑和give_greeting函數(shù)匹配筋遭。
然而打颤,雖然這是您創(chuàng)建視圖的典型方式,但它實際上隱藏了一些細(xì)節(jié)漓滔。 實際上编饺,F(xiàn)lask并沒有直接從URL到應(yīng)該處理這個請求的視圖函數(shù)。 它并不是簡單的做如下處理:

URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "my_greeting")

實際上响驴,還有一個步驟---將URL映射到一個端點:

URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "my_greeting".
Requests to Endpoint "my_greeting" should be handled by View Function "my_greeting"

“endpoint” 是用于確定 Request 該由代碼的哪個邏輯單元來處理透且。 通常情況下,endpoint 只是一個視圖函數(shù)的名稱豁鲤。 但是秽誊,實際上可以更改端點,如下例所示:

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

現(xiàn)在畅形,當(dāng)Flask路由請求時养距,邏輯如下所示:

URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "say_hello".
Endpoint "say_hello" should be handled by View Function "my_greeting"

如何使用endpoint

端點通常用于“反向查找”。 例如日熬,在Flask應(yīng)用程序的一個視圖函數(shù)中想要引用另一個視圖函數(shù)棍厌。 可以使用 url_for() ,而不是直接使用URL竖席。 示例如下:

@app.route('/')
def index():
    print url_for('give_greeting', name='Mark') # This will print '/greeting/Mark'

@app.route('/greeting/<name>')
def give_greeting(name):
    return 'Hello, {0}!'.format(name)

這是有利的耘纱,因為現(xiàn)在我們可以改變我們的應(yīng)用程序的URL而不需要改變我們引用該資源的那一行。

為什么不直接用視圖函數(shù)呢毕荐?

現(xiàn)在的問題是:“為什么我們需要這個額外的層 (endpoint) 束析? 為什么要將路徑映射到endpoint,然后將endpoint映射到視圖函數(shù)憎亚? 為什么不跳過這個中間步驟员寇?

原因是因為這種方式更強(qiáng)大。 例如第美,F(xiàn)lask Blueprints允許您將應(yīng)用程序分成不同的部分蝶锋。 我可能將所有管理端資源都放在名為“admin”的 blueprint 中,并將所有用戶級資源放在“user”的 endpoint中什往。

Blueprints 允許您將這些分隔到命名空間中扳缕。 例如...
main.py:

from flask import Flask, Blueprint
from admin import admin
from user import user

app = 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')
def greeting():
    return 'Hello, administrative user!'

user.py:

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

請注意,在這兩個blueprint中,“/ greeting”路由是一個名為“greeting”的函數(shù)躯舔。 如果我想引用admin 的 “greeting” 函數(shù)驴剔,我們需要使用 "admin.greeting"。 endpoint 允許我們將blueprint的名稱指定為端點的一部分粥庄,從而實現(xiàn)一種命名空間丧失。 所以,我們可以使用下面的做法:

print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飒赃,一起剝皮案震驚了整個濱河市利花,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌载佳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臀栈,死亡現(xiàn)場離奇詭異蔫慧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)权薯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門姑躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盟蚣,你說我怎么就攤上這事黍析。” “怎么了屎开?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵阐枣,是天一觀的道長。 經(jīng)常有香客問我奄抽,道長蔼两,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任逞度,我火速辦了婚禮额划,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘档泽。我一直安慰自己俊戳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布馆匿。 她就那樣靜靜地躺著抑胎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甜熔。 梳的紋絲不亂的頭發(fā)上圆恤,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼盆昙。 笑死羽历,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淡喜。 我是一名探鬼主播秕磷,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炼团!你這毒婦竟也來了澎嚣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瘟芝,失蹤者是張志新(化名)和其女友劉穎易桃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锌俱,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晤郑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贸宏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片造寝。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吭练,靈堂內(nèi)的尸體忽然破棺而出诫龙,到底是詐尸還是另有隱情,我是刑警寧澤鲫咽,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布签赃,位于F島的核電站,受9級特大地震影響浑侥,放射性物質(zhì)發(fā)生泄漏姊舵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一寓落、第九天 我趴在偏房一處隱蔽的房頂上張望括丁。 院中可真熱鬧,春花似錦伶选、人聲如沸史飞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽构资。三九已至,卻和暖如春陨簇,著一層夾襖步出監(jiān)牢的瞬間吐绵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留己单,地道東北人唉窃。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像纹笼,于是被迫代替她去往敵國和親纹份。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 可以翻譯成“視圖入口”廷痘,就是個名字蔓涧。url_for可以用到,其他方面也可以用到(比如導(dǎo)航條確定當(dāng)前頁面)笋额,因為en...
    卡薩諾瓦_(dá)閱讀 730評論 0 0
  • 22年12月更新:個人網(wǎng)站關(guān)停元暴,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,184評論 22 257
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)兄猩,斷路器昨寞,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Flask中'endpoint'(端點)的理解 翻譯整理自Stack Overflow:http://stacko...
    摩訶婆羅多閱讀 9,155評論 4 13
  • 解釋1: 允許將應(yīng)用組織為模塊,每個模塊有自洽的 MVC厦滤,開發(fā)者做些工作可以使模塊間依賴盡可能少,必要時可以按 b...
    大詩兄_zl閱讀 2,210評論 1 1