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

輕量級的Web框架Flask 中模塊化應(yīng)用的實現(xiàn)

 更新時間:2017年09月11日 08:40:53   作者:走在編程路上的小白  
說到flask的模塊化,大家可能第一時間想到的都是藍圖,今天我們不討論藍圖,先從0.2版本中的Module類的實現(xiàn)講起

Flask是一個輕量級的Web框架。雖然是輕量級的,但是對于組件一個大型的、模塊化應(yīng)用也是能夠?qū)崿F(xiàn)的,“藍圖”就是這樣一種實現(xiàn)。對于模塊化應(yīng)用的實現(xiàn),在Flask 0.2版本中進行了設(shè)計。本文暫時不對“藍圖”做詳細的介紹,而是先從0.2版本中的Module類的實現(xiàn)講起。其實,“藍圖”的實現(xiàn)和Module類的實現(xiàn)很相似。

為什么實現(xiàn)模塊化應(yīng)用

對于大型應(yīng)用而言,隨著功能的不斷增加,整個應(yīng)用的規(guī)模也會擴大。按照一定的規(guī)則將應(yīng)用的不同部分進行模塊化,不僅能夠使整個應(yīng)用邏輯清晰,也易于維護。例如,在Flask中,你也許想像如下構(gòu)建一個簡單的項目:

/myapplication
  /__init__.py
  /views
    /__init__.py
    /admin.py
    /frontend.py

以上目錄結(jié)構(gòu)中,我們將之前的Flask單文件修改成了一個應(yīng)用包,所有的視圖函數(shù)都在views下,并且按照功能分為了admin和frontend兩個部分。為了實現(xiàn)這種模塊化應(yīng)用的構(gòu)建,在0.2版本中Flask實現(xiàn)了Module類。這個類實例可以通過注冊的方式,在Flask應(yīng)用創(chuàng)建后添加進應(yīng)用。

Module類實現(xiàn)了一系列的方法:

•route(rule, **options)
•add_url_rule(rule, endpoint, view_func=None, **options)
•before_request(f)
•before_app_request(f)
•after_request(f)
•after_app_request(f)
•context_processor(f)
•app_context_processor(f)
•_record(func)

以上方法除了add_url_rule和_record外,都可以作為裝飾器在自己的模塊中使用,這些裝飾器都返回一個函數(shù)。通過調(diào)用_record方法,可以將裝飾器返回的函數(shù)放到_register_events中。當(dāng)Flask應(yīng)用創(chuàng)建之后,通過運行_register_events列表中的函數(shù),可以將這個模塊注冊到應(yīng)用中去。

Flask應(yīng)用怎么注冊一個Module

以下我們以一個例子來說明Flask應(yīng)用怎么注冊一個Module。

1. 項目結(jié)構(gòu)

這個簡單的例子項目結(jié)構(gòu)如下:

/myapplication
  /__init__.py
  /app.py
  /views
    /__init__.py
    /admin.py
    /blog.py

admin.py和blog.py兩個模塊的代碼如下:

# admin.py
from flask import Module
admin = Module(__name__)
@admin.route('/')
def index():
  return "This is admin page!"
@admin.route('/profile')
def profile():
  return "This is profile page."

# blog.py
from flask import Module
blog = Module(__name__)
@blog.route('/')
def index():
  return "This is my blog!"
@blog.route('/article/<int:id>')
def article(id):
  return "The article id is %d." % id

以上兩個模塊中,我們首先分別創(chuàng)建了一個Module類,然后像寫一般的視圖函數(shù)一樣,為每個模塊增加一些規(guī)則。之后,可以在創(chuàng)建Flask應(yīng)用的時候?qū)⑦@些模塊引入,就可以注冊了。

# app.py
from flask import Flask
from views.admin import admin
from views.blog import blog
app = Flask(__name__)
@app.route('/')
def index():
  return "This is my app."
app.register_module(blog, url_prefix='/blog')
app.register_module(admin, url_prefix='/admin')
if __name__ == '__main__':
  from werkzeug.serving import run_simple
  run_simple('localhost', 5000, app)

在app.py中:

•我們首先引入了admin和blog兩個Module對象;
•之后,我們創(chuàng)建了一個Flask應(yīng)用app,并且為這個應(yīng)用增加了一個視圖函數(shù);
•為了注冊模塊,我們調(diào)用了應(yīng)用的register_module方法;
•最后,從werkzeug.serving中我們調(diào)用run_simple方法,用來創(chuàng)建一個本地的服務(wù)器用于測試這個Flask應(yīng)用。

根據(jù)以上的步驟,我們就可以測試這個應(yīng)用。分別以/blog和/admin為URL前綴,就可以訪問blog和admin兩個模塊了。

2. 注冊Module時發(fā)生了什么

根據(jù)上面的例子,只要簡單的調(diào)用Flask應(yīng)用的register_module方法,就可以注冊一個Module了。關(guān)于register_module方法的代碼如下:

def register_module(self, module, **options):
  """Registers a module with this application. The keyword argument
  of this function are the same as the ones for the constructor of the
  :class:`Module` class and will override the values of the module if
  provided.
  """
  options.setdefault('url_prefix', module.url_prefix)
  state = _ModuleSetupState(self, **options)
  for func in module._register_events:
    func(state)

通過以上代碼可以發(fā)現(xiàn):
•可以通過增加url_prefix來區(qū)分不同的Module,這在app注冊admin和blog時我們已經(jīng)看到了;
•在注冊時,我們創(chuàng)建了一個_ModuleSetupState的類,這個類接收Flask應(yīng)用和一些參數(shù)生成一個state實例。這個實例反映了當(dāng)前Flask應(yīng)用的狀態(tài)。
•前面在講到Module類的時候,我們講到Module未注冊時會將自己模塊的一些功能實現(xiàn)都放在_register_events列表中,這些功能實現(xiàn)都是函數(shù)形式。當(dāng)需要將模塊注冊到某一應(yīng)用上時,只需要傳遞關(guān)于這個應(yīng)用信息的參數(shù)即可,即就是上面的state實例。這樣,通過運行函數(shù),可以講一些屬性綁定到當(dāng)前應(yīng)用上去。

以上面例子中不同模塊的URL綁定來講,通過注冊,應(yīng)用app現(xiàn)形成了如下的URL“地圖”:

>>> app.url_map
Map([<Rule '/admin/profile' (HEAD, GET) -> admin.profile>,
   <Rule '/admin/' (HEAD, GET) -> admin.index>,
   <Rule '/blog/' (HEAD, GET) -> blog.index>,
   <Rule '/' (HEAD, GET) -> index>,
   <Rule '/blog/article/<id>' (HEAD, GET) -> blog.article>,
   <Rule '/static/<filename>' (HEAD, GET) -> static>]
  )
>>> app.url_map._rules_by_endpoint
{'admin.index': [<Rule '/admin/' (HEAD, GET) -> admin.index>],
 'admin.profile': [<Rule '/admin/profile' (HEAD, GET) -> admin.profile>],
 'blog.article': [<Rule '/blog/article/<id>' (HEAD, GET) -> blog.article>],
 'blog.index': [<Rule '/blog/' (HEAD, GET) -> blog.index>],
 'index': [<Rule '/' (HEAD, GET) -> index>],
 'static': [<Rule '/static/<filename>' (HEAD, GET) -> static>]
}
>>> app.view_functions
{'admin.index': <function views.admin.index>,
 'admin.profile': <function views.admin.profile>,
 'blog.article': <function views.blog.article>,
 'blog.index': <function views.blog.index>,
 'index': <function __main__.index>
}

這樣,就可以把不同模塊的URL規(guī)則放在一起,并在endpoint和視圖函數(shù)之間形成對應(yīng)關(guān)系。關(guān)于Flask應(yīng)用中URL處理,可以參考:Flask應(yīng)用中的URL處理。

相關(guān)文章

  • Python實現(xiàn)選擇排序

    Python實現(xiàn)選擇排序

    選擇法也算是入門的一種排序算法,比起冒泡法,它的方法巧妙了一些,它的出發(fā)點在于“挑”,每次挑選數(shù)組的最值,與前置元素換位,然后繼續(xù)挑選剩余元素的最值并重復(fù)操作。個人認為選擇排序的意義不在于排序本身,而在于挑選和置換的方法,對于一些問題很有幫助。
    2017-06-06
  • pycharm遠程連接服務(wù)器運行pytorch的過程詳解

    pycharm遠程連接服務(wù)器運行pytorch的過程詳解

    這篇文章主要介紹了在Linux環(huán)境下使用Anaconda管理不同版本的Python環(huán)境,并通過PyCharm遠程連接服務(wù)器來運行PyTorch的過程,包括安裝PyTorch、CUDA以及配置PyCharm遠程開發(fā)環(huán)境的詳細步驟,需要的朋友可以參考下
    2025-02-02
  • Python中bisect的用法及示例詳解

    Python中bisect的用法及示例詳解

    這篇文章主要介紹了Python中bisect的用法及示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 基于Python爬取股票數(shù)據(jù)過程詳解

    基于Python爬取股票數(shù)據(jù)過程詳解

    這篇文章主要介紹了基于Python爬取股票數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 解讀dataframe中有關(guān)inf的處理技巧

    解讀dataframe中有關(guān)inf的處理技巧

    這篇文章主要介紹了解讀dataframe中有關(guān)inf的處理技巧,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python去除html標簽的幾種方法總結(jié)

    Python去除html標簽的幾種方法總結(jié)

    這篇文章主要介紹了Python去除html標簽的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python處理JSON時的值報錯及編碼報錯的兩則解決實錄

    Python處理JSON時的值報錯及編碼報錯的兩則解決實錄

    這篇文章主要介紹了Python處理JSON時的值報錯及編碼報錯的兩則解決實錄,在這里還是想建議一下使用Python 3.x版本,Python 3默認的Unicode編碼能在實際使用中為我們省去不少問題,需要的朋友可以參考下
    2016-06-06
  • Python語言中的數(shù)據(jù)類型-序列

    Python語言中的數(shù)據(jù)類型-序列

    這篇文章主要介紹了Python語言中的數(shù)據(jù)類型-序列,前面我們提到了Python數(shù)據(jù)類型中的內(nèi)置數(shù)值類型與字符串類型。今天學(xué)習(xí)一下Python的序列數(shù)據(jù)類型,要知道的是在Python中沒有數(shù)組這一數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考一下
    2022-02-02
  • 詳解如何使用Pandas處理時間序列數(shù)據(jù)

    詳解如何使用Pandas處理時間序列數(shù)據(jù)

    時間序列數(shù)據(jù)在數(shù)據(jù)分析建模中很常見,例如天氣預(yù)報,空氣狀態(tài)監(jiān)測,股票交易等金融場景,本文給大家詳細介紹了如何使用Pandas處理時間序列數(shù)據(jù),文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 零基礎(chǔ)學(xué)習(xí)Python爬蟲

    零基礎(chǔ)學(xué)習(xí)Python爬蟲

    這篇文章主要講解了Python爬蟲的基礎(chǔ)知識,文中相關(guān)知識講解的非常詳細,感興趣的小伙伴可以參考參考
    2021-08-08

最新評論

措勤县| 西畴县| 祁阳县| 象州县| 泾阳县| 金塔县| 应用必备| 杨浦区| 崇明县| 宁南县| 营口市| 汝州市| 墨玉县| 奈曼旗| 崇阳县| 临武县| 招远市| 明光市| 苍南县| 南漳县| 洛宁县| 交口县| 彭山县| 阿城市| 巴南区| 门源| 泸定县| 隆林| 同心县| 富蕴县| 景谷| 南漳县| 曲沃县| 拜泉县| 共和县| 吉隆县| 卢氏县| 静乐县| 乐业县| 集安市| 梁山县|