激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 輕量級(jí)的Web框架Flask 中模塊化應(yīng)用的實(shí)現(xiàn)

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

2020-12-07 00:20走在編程路上的小白 Python

說(shuō)到flask的模塊化,大家可能第一時(shí)間想到的都是藍(lán)圖,今天我們不討論藍(lán)圖,先從0.2版本中的Module類的實(shí)現(xiàn)講起

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

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

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

?
1
2
3
4
5
6
/myapplication
  /__init__.py
  /views
    /__init__.py
    /admin.py
    /frontend.py

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

Module類實(shí)現(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外,都可以作為裝飾器在自己的模塊中使用,這些裝飾器都返回一個(gè)函數(shù)。通過(guò)調(diào)用_record方法,可以將裝飾器返回的函數(shù)放到_register_events中。當(dāng)Flask應(yīng)用創(chuàng)建之后,通過(guò)運(yùn)行_register_events列表中的函數(shù),可以將這個(gè)模塊注冊(cè)到應(yīng)用中去。

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

以下我們以一個(gè)例子來(lái)說(shuō)明Flask應(yīng)用怎么注冊(cè)一個(gè)Module。

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

這個(gè)簡(jiǎn)單的例子項(xiàng)目結(jié)構(gòu)如下:

?
1
2
3
4
5
6
7
/myapplication
  /__init__.py
  /app.py
  /views
    /__init__.py
    /admin.py
    /blog.py

admin.py和blog.py兩個(gè)模塊的代碼如下:

?
1
2
3
4
5
6
7
8
9
# 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."
?
1
2
3
4
5
6
7
8
9
# 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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 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兩個(gè)Module對(duì)象;
•之后,我們創(chuàng)建了一個(gè)Flask應(yīng)用app,并且為這個(gè)應(yīng)用增加了一個(gè)視圖函數(shù);
•為了注冊(cè)模塊,我們調(diào)用了應(yīng)用的register_module方法;
•最后,從werkzeug.serving中我們調(diào)用run_simple方法,用來(lái)創(chuàng)建一個(gè)本地的服務(wù)器用于測(cè)試這個(gè)Flask應(yīng)用。

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

2. 注冊(cè)Module時(shí)發(fā)生了什么

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

?
1
2
3
4
5
6
7
8
9
10
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)

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> 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ù)之間形成對(duì)應(yīng)關(guān)系。關(guān)于Flask應(yīng)用中URL處理,可以參考:Flask應(yīng)用中的URL處理。

原文鏈接:http://fanchunke.me/Flask/Flask%E4%B8%AD%E6%A8%A1%E5%9D%97%E5%8C%96%E5%BA%94%E7%94%A8%E7%9A%84%E5%AE%9E%E7%8E%B0/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: chinese中国真实乱对白 | 神马福利网 | www.91sp| 羞羞视频免费观看网站 | 天堂成人一区二区三区 | 日韩精品久久久久久久九岛 | 久久久免费 | av在线久草 | 国产精品视频免费在线观看 | 99激情视频 | 久久久久久久一区二区 | 88xx成人永久免费观看 | 毛片国产 | 午夜视频大全 | 美女久久久久 | 精品一区久久久 | 国产日本在线 | 国内精品伊人久久 | 久久综合九色综合久久久精品综合 | 国产欧美在线观看不卡一 | 国产精品午夜未成人免费观看 | 成人免费入口 | 九一传媒在线观看 | 欧美韩国一区 | japanese javhd | 色综合激情 | 男女隐私免费视频 | 特色一级黄色片 | 中文在线观看视频 | 色污视频在线观看 | 国产精品久久久久久婷婷天堂 | 九九热视频这里只有精品 | 亚洲特黄| 伊人成人免费视频 | 久久精品视频在线免费观看 | 九九热视频这里只有精品 | www.99久久久| 色操网| 精品国产一区二区三区久久久蜜月 | 久国产 | 国产成人av在线播放 |