最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

首先,我們看一個例子:

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

這個是我們在用flask框架寫網(wǎng)站中最常用的。

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

函數(shù)等效于

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

這個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.

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

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

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

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

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

我們可以通過一個例子來看:

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()

運行這個程序,結(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)

所以我們可以看出:這個url_map存儲的是url與endpoint的映射!

回到flask接受用戶請求地址并查詢函數(shù)的問題。實際上,當請求傳來一個url的時候,會先通過rule找到endpoint(url_map),然后再根據(jù)endpoint再找到對應(yīng)的view_func(view_functions)。通常,endpoint的名字都和視圖函數(shù)名一樣。

這時候,這個endpoint也就好理解了:

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

當有請求來到的時候,用它來知道到底使用哪一個視圖函數(shù)

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

這個時候,我們就不能使用視圖函數(shù)名當endpoint去查詢了

我們舉個例子來說明。比如:

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

我們注冊了2個藍圖。

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

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

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

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

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

url_for('user.article')

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

相關(guān)文章

  • python實現(xiàn)canny邊緣檢測

    python實現(xiàn)canny邊緣檢測

    本文主要講解了canny邊緣檢測原理:計算梯度幅值和方向、根據(jù)角度對幅值進行非極大值抑制、用雙閾值算法檢測和連接邊緣以及python 實現(xiàn)
    2020-09-09
  • python imutils包基本概念及使用

    python imutils包基本概念及使用

    python imutils包可以很簡潔的調(diào)用opencv接口,輕松實現(xiàn)圖像的平移,旋轉(zhuǎn),縮放,骨架化等操作,對python imutils包基本概念及使用方法感興趣的朋友一起看看吧
    2021-07-07
  • Python實現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解

    Python實現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解

    這篇文章主要為大家介紹了Python實現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • python四則運算表達式求值示例詳解

    python四則運算表達式求值示例詳解

    這篇文章主要為大家介紹了python四則運算表達式求值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Python Locals變量管理新嘗試引領(lǐng)代碼風(fēng)潮

    Python Locals變量管理新嘗試引領(lǐng)代碼風(fēng)潮

    在Python中,locals()函數(shù)是一個強大的工具,它使程序員能夠訪問和操作當前作用域內(nèi)的局部變量,本文將深入探討locals()函數(shù)的功能、應(yīng)用和重要性
    2024-01-01
  • Pandas 缺失數(shù)據(jù)處理的實現(xiàn)

    Pandas 缺失數(shù)據(jù)處理的實現(xiàn)

    這篇文章主要介紹了Pandas 缺失數(shù)據(jù)處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python寫的ARP攻擊代碼實例

    python寫的ARP攻擊代碼實例

    這篇文章主要介紹了python寫的ARP攻擊代碼實例,需要的朋友可以參考下
    2014-06-06
  • Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫實例

    Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫實例

    這篇文章主要介紹了Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫實例,本文直接給出操作mysql代碼實例,包含創(chuàng)建表、插入數(shù)據(jù)、插入多條數(shù)據(jù)、查詢數(shù)據(jù)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python使用Flask編寫一個網(wǎng)站的代碼指南

    Python使用Flask編寫一個網(wǎng)站的代碼指南

    使用Flask編寫一個網(wǎng)站是一個相對簡單且有趣的過程,Flask是一個用Python編寫的輕量級Web應(yīng)用框架,它易于上手,同時也非常強大,適合構(gòu)建從簡單的博客到復(fù)雜的Web應(yīng)用的各種項目,以下是一個使用Flask編寫簡單網(wǎng)站的指南,包括代碼示例,需要的朋友可以參考下
    2024-11-11
  • Python中import機制詳解

    Python中import機制詳解

    在剛剛接觸python時,我們會被其優(yōu)美的格式、簡潔的語法和無窮無盡的類庫所震撼。在真正的將python應(yīng)用到實際的項目中,你會遇到一些無法避免的問題。最讓人困惑不解的問題有二類,一個編碼問題,另一個則是引用問題。本文主要討論關(guān)于Python中import的機制與實現(xiàn)
    2017-11-11

最新評論

醴陵市| 郸城县| 广水市| 利辛县| 高碑店市| 高州市| 南投县| 拜城县| 闵行区| 中阳县| 五指山市| 彰化市| 洪湖市| 永德县| 临泉县| 视频| 澎湖县| 江源县| 贵州省| 彭水| 桐乡市| 北票市| 岱山县| 遂溪县| 将乐县| 桐城市| 郯城县| 神木县| 武邑县| 利津县| 榆林市| 黔西县| 乌什县| 凤山市| 玛曲县| 泌阳县| 内江市| 班戈县| 甘肃省| 林口县| 缙云县|