欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flask中endpoint的理解(小結(jié))

 更新時(shí)間:2019年12月11日 11:05:55   作者:Eric_Nirvana  
這篇文章主要介紹了Flask中endpoint的理解(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在flask框架中,我們經(jīng)常會(huì)遇到endpoint這個(gè)東西,最開(kāi)始也沒(méi)法理解這個(gè)到底是做什么的。最近正好在研究Flask的源碼,也就順帶了解了一下這個(gè)endpoint

首先,我們看一個(gè)例子:

@app.route('/user/<name>')
def user(name):
  return 'Hello, %s' % name

這個(gè)是我們?cè)谟胒lask框架寫(xiě)網(wǎng)站中最常用的。

通過(guò)看源碼,我們可以發(fā)現(xiàn):

函數(shù)等效于

def user(name)
  return 'Hello, %s' % name
  
app.add_url_rule('/user/<name>', 'user', user)

這個(gè)add_url_rule函數(shù)在文檔中是這樣解釋的:

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.

add_url_rule有如下參數(shù):

rule – the URL rule as string
endpoint – the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint
view_func – the function to call when serving a request to the provided endpoint
options – the options to be forwarded to the underlying Rule object. A change to Werkzeug is handling of method options. methods is a list of methods this rule should be limited to (GET, POST etc.). By default a rule just listens for GET (and implicitly HEAD). Starting with Flask 0.6, OPTIONS is implicitly added and handled by the standard request handling.

拋開(kāi)options這個(gè)參數(shù)不談,我們看看前三個(gè)參數(shù)。
rule:這個(gè)參數(shù)很簡(jiǎn)單,就是匹配的路由地址
view_func:這個(gè)參數(shù)就是我們寫(xiě)的視圖函數(shù)
endpoint:這個(gè)參數(shù)就是我今天重點(diǎn)要講的,endpoint

很多人認(rèn)為:假設(shè)用戶(hù)訪問(wèn)http://www.example.com/user/eric,flask會(huì)找到該函數(shù),并傳遞name='eric',執(zhí)行這個(gè)函數(shù)并返回值。

但是實(shí)際中,F(xiàn)lask真的是直接根據(jù)路由查詢(xún)視圖函數(shù)么?

在源碼中我們可以發(fā)現(xiàn):

  • 每個(gè)應(yīng)用程序app都有一個(gè)view_functions,這是一個(gè)字典,存儲(chǔ)endpoint-view_func鍵值對(duì)。add_url_rule的第一個(gè)作用就是向view_functions中添加鍵值對(duì)(這件事在應(yīng)用程序run之前就做好了)
  • 每個(gè)應(yīng)用程序app都有一個(gè)url_map,它是一個(gè)Map類(lèi)(具體實(shí)現(xiàn)在werkzeug/routing.py中),里面包含了一個(gè)列表,列表元素是Role的實(shí)例(werkzeug/routing.py中)。add_url_rule的第二個(gè)作用就是向url_map中添加Role的實(shí)例(它也是在應(yīng)用程序run之前就做好了)

我們可以通過(guò)一個(gè)例子來(lái)看:

app = Flask(__name__)

@app.route('/test', endpoint='Test')
def test():
  pass


@app.route('/', endpoint='index')
def hello_world():
  return 'Hello World!'

if __name__ == '__main__':
  print(app.view_functions)
  print(app.url_map)
  app.run()

運(yùn)行這個(gè)程序,結(jié)果是:

{'static': <bound method Flask.send_static_file of <Flask 'flask-code'>>, 'Test': <function test at 0x10065e488>, 'index': <function hello_world at 0x10323d488>}
Map([<Rule '/test' (HEAD, OPTIONS, GET) -> Test>,
 <Rule '/' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

所以我們可以看出:這個(gè)url_map存儲(chǔ)的是url與endpoint的映射!

回到flask接受用戶(hù)請(qǐng)求地址并查詢(xún)函數(shù)的問(wèn)題。實(shí)際上,當(dāng)請(qǐng)求傳來(lái)一個(gè)url的時(shí)候,會(huì)先通過(guò)rule找到endpoint(url_map),然后再根據(jù)endpoint再找到對(duì)應(yīng)的view_func(view_functions)。通常,endpoint的名字都和視圖函數(shù)名一樣。

這時(shí)候,這個(gè)endpoint也就好理解了:

實(shí)際上這個(gè)endpoint就是一個(gè)Identifier,每個(gè)視圖函數(shù)都有一個(gè)endpoint,

當(dāng)有請(qǐng)求來(lái)到的時(shí)候,用它來(lái)知道到底使用哪一個(gè)視圖函數(shù)

在實(shí)際應(yīng)用中,當(dāng)我們需要在一個(gè)視圖中跳轉(zhuǎn)到另一個(gè)視圖中的時(shí)候,我們經(jīng)常會(huì)使用url_for(endpoint)去查詢(xún)視圖,而不是把地址硬編碼到函數(shù)中。

這個(gè)時(shí)候,我們就不能使用視圖函數(shù)名當(dāng)endpoint去查詢(xún)了

我們舉個(gè)例子來(lái)說(shuō)明。比如:

app = Flask(__name__)
app.register_blueprint(user, url_prefix='user')
app.register_blueprint(file, url_prefix='file')

我們注冊(cè)了2個(gè)藍(lán)圖。

在user中(省略初始化過(guò)程):

@user.route('/article')
def article():
  pass

在file中(省略初始化過(guò)程):

@file.route('/article')
def article():
  pass

這時(shí)候,我們發(fā)現(xiàn),/article這個(gè)路由對(duì)應(yīng)了兩個(gè)函數(shù)名一樣的函數(shù),分別在兩個(gè)藍(lán)圖中。當(dāng)我們使用url_for(article)調(diào)用的時(shí)候(注意,url_for是通過(guò)endpoint查詢(xún)url地址,然后找視圖函數(shù)),flask無(wú)法知道到底使用哪個(gè)藍(lán)圖下的endpoint,所以我們需要這樣:

url_for('user.article')

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà)

    如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà)

    這篇文章主要介紹了如何利用python實(shí)現(xiàn)圖片轉(zhuǎn)化字符畫(huà),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • 提升Python項(xiàng)目整潔度使用import?linter實(shí)例探究

    提升Python項(xiàng)目整潔度使用import?linter實(shí)例探究

    在復(fù)雜的Python項(xiàng)目中,良好的代碼組織結(jié)構(gòu)是維護(hù)性和可讀性的關(guān)鍵,本文將深入研究?import-linter?工具,它是一個(gè)強(qiáng)大的靜態(tài)分析工具,旨在優(yōu)化項(xiàng)目的模塊導(dǎo)入,提高代碼質(zhì)量和可維護(hù)性
    2024-01-01
  • Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫(huà)效果【附源碼下載】

    Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫(huà)效果【附源碼下載】

    這篇文章主要介紹了Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫(huà)效果,涉及Python tkinter模塊操作圖片基于坐標(biāo)動(dòng)態(tài)變換與數(shù)值判定實(shí)現(xiàn)移動(dòng)、碰撞檢測(cè)等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • python3如何獲取子線程中函數(shù)返回值

    python3如何獲取子線程中函數(shù)返回值

    這篇文章主要介紹了python3如何獲取子線程中函數(shù)返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • python如何快速生成時(shí)間戳

    python如何快速生成時(shí)間戳

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python生成時(shí)間戳的簡(jiǎn)單方法,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python中turtle庫(kù)常用代碼匯總

    Python中turtle庫(kù)常用代碼匯總

    Turtle庫(kù)是Python語(yǔ)言中一個(gè)很流行的繪制圖像的函數(shù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于Python中turtle庫(kù)常用代碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子

    實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子

    這篇文章主要介紹了實(shí)現(xiàn)ECharts雙Y軸左右刻度線一致的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python 機(jī)器學(xué)習(xí)第一章環(huán)境配置圖解流程

    Python 機(jī)器學(xué)習(xí)第一章環(huán)境配置圖解流程

    機(jī)器學(xué)習(xí)是一類(lèi)算法的總稱(chēng),這些算法企圖從大量歷史數(shù)據(jù)中挖掘出其中隱含的規(guī)律,并用于預(yù)測(cè)或者分類(lèi),更具體的說(shuō),機(jī)器學(xué)習(xí)可以看作是尋找一個(gè)函數(shù),輸入是樣本數(shù)據(jù),輸出是期望的結(jié)果,只是這個(gè)函數(shù)過(guò)于復(fù)雜,以至于不太方便形式化表達(dá)
    2021-11-11
  • 在PyCharm下使用 ipython 交互式編程的方法

    在PyCharm下使用 ipython 交互式編程的方法

    今天小編就為大家分享一篇在PyCharm下使用 ipython 交互式編程的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • TensorFlow人工智能學(xué)習(xí)數(shù)據(jù)填充復(fù)制實(shí)現(xiàn)示例

    TensorFlow人工智能學(xué)習(xí)數(shù)據(jù)填充復(fù)制實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)如何進(jìn)行數(shù)據(jù)填充復(fù)制的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11

最新評(píng)論