国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

服務器之家 - 腳本之家 - Python - 輕量級的Web框架Flask 中模塊化應用的實現

輕量級的Web框架Flask 中模塊化應用的實現

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

說到flask的模塊化,大家可能第一時間想到的都是藍圖,今天我們不討論藍圖,先從0.2版本中的Module類的實現講起

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

為什么實現模塊化應用

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

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

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

Module類實現了一系列的方法:

•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外,都可以作為裝飾器在自己的模塊中使用,這些裝飾器都返回一個函數。通過調用_record方法,可以將裝飾器返回的函數放到_register_events中。當Flask應用創建之后,通過運行_register_events列表中的函數,可以將這個模塊注冊到應用中去。

Flask應用怎么注冊一個Module

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

1. 項目結構

這個簡單的例子項目結構如下:

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

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

?
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

以上兩個模塊中,我們首先分別創建了一個Module類,然后像寫一般的視圖函數一樣,為每個模塊增加一些規則。之后,可以在創建Flask應用的時候將這些模塊引入,就可以注冊了。

?
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兩個Module對象;
•之后,我們創建了一個Flask應用app,并且為這個應用增加了一個視圖函數;
•為了注冊模塊,我們調用了應用的register_module方法;
•最后,從werkzeug.serving中我們調用run_simple方法,用來創建一個本地的服務器用于測試這個Flask應用。

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

2. 注冊Module時發生了什么

根據上面的例子,只要簡單的調用Flask應用的register_module方法,就可以注冊一個Module了。關于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)

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

以上面例子中不同模塊的URL綁定來講,通過注冊,應用app現形成了如下的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規則放在一起,并在endpoint和視圖函數之間形成對應關系。關于Flask應用中URL處理,可以參考:Flask應用中的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/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品无 | 日韩在线观看一区 | 久久网站热最新地址 | 久久一级黄 | 国产精品久久国产精品 | 亚洲视频综合 | 秋霞电影院午夜伦 | 免费在线一区二区 | 激情五月婷婷基地 | 亚洲欧洲精品成人久久奇米网 | 青青草91青娱盛宴国产 | 日韩中文字幕 | 九九热免费精品视频 | 日韩成人精品在线 | 91精品国产综合久久久久久丝袜 | 久久亚洲视频 | 国产精品欧美一区二区三区不卡 | 性色av一区二区三区 | 亚洲 欧美 日韩在线 | 在线婷婷 | 97久久精品人人澡人人爽 | 日本在线观看网址 | 久久国产精品无码网站 | 亚洲一级黄色 | 日韩国产一区二区三区 | 国产成人精品一区二区三区视频 | 久久视频精品 | 中文字幕国产一区 | 不用播放器的毛片 | 日韩精品在线免费观看 | 国产精品女同一区二区免费站 | 亚洲精品成人悠悠色影视 | h在线观看视频 | 亚洲精品视频网站在线观看 | 久久伊人国产 | 在线国产视频 | 日本精品视频在线观看 | av成人免费 | 免费观看欧美一级大片 | 成人免费一区二区三区视频网站 | 亚洲欧美在线播放 |