之前在Flask介紹裡說過,Flask最主要的特點之一就是大多數功能是由豐富的擴充套件來完成的。從另一方面來看,Flask之所以廣受歡迎,也離不開眾多良好擴充套件的支援。
下面以Flask-Bootstrap為例,介紹擴充套件的相關內容。關於專案結構,工廠函式,藍本等內容後面會介紹,在這裡不做深入。
安裝與匯入
安裝
擴充套件可以使用easy_install或pip安裝,使用pip:
pip install 副檔名
擴充套件的命名方式一般為“flask-ability”,這裡的ability是擴充套件要整合的庫或是功能,例如flask-script,flask-bootstrap。
pip install flask-bootstrap
匯入
匯入時擴充套件中的橫線換成下劃線,即“flask_ability”。
from
flask_bootstrap
import
Bootstrap
配置
擴充套件的配置和Flask的配置以及自定義的配置一樣,都儲存在配置字典裡,所以你可以把它寫在單獨的配置檔案裡,然後在建立程式例項時載入。具體細節見Flask專案配置。
初始化
有兩種方法初始化擴充套件:
1、例項化擴充套件類
在一個小的程式裡,可以直接匯入擴充套件類,傳入當前的程式例項(即“app”):
from
flask
import
Flask
from
flask_bootstrap
import
Bootstrap
app
=
Flask
(
__name__
)
bootstrap
=
Bootstrap
(
app
)
2、使用初始化方法
每個擴充套件都會提供一個初始化方法:
init_app()
。擴充套件在這個方法里加載相應的配置,實現初始化操作。一個典型的例子:
flask_bootstrap/__init__。py
class
Bootstrap
(
object
):
def
__init__
(
self
,
app
=
None
):
if
app
is
not
None
:
self
。
init_app
(
app
)
def
init_app
(
self
,
app
):
app
。
config
。
setdefault
(
‘BOOTSTRAP_USE_MINIFIED’
,
True
)
app
。
config
。
setdefault
(
‘BOOTSTRAP_CDN_FORCE_SSL’
,
False
)
# 。。。
在這裡可以看到,如果使用上一種方法,例項化Bootstrap並傳入程式例項,同樣會呼叫init_app()方法。
在使用工廠函式來建立程式時,我們這樣初始化擴充套件:
from
flask
import
Flask
from
flask_bootstrap
import
Bootstrap
from
config
import
config
bootstrap
=
Bootstrap
()
# 不傳入程式例項
def
create_app
(
config
):
app
=
Flask
(
__name__
)
app
。
config
。
from_object
(
config
)
bootstrap
。
init_app
(
app
)
return
app
把這個函式存為單獨的檔案,然後在你的程式主腳本里使用app = create_app()來建立程式例項。
管理
對於小專案,你可以直接把擴充套件的匯入和初始化都放在主腳本里。大的專案有兩種常見的管理方式:
1、和工廠函式(create_app())放在一起
放在程式包的構造檔案(app/__init__。py),或是單獨建立的檔案(app。py)裡。見上面的程式碼片段。
2、放在單獨的檔案裡
當使用的擴充套件比較多時,你也可以建立一個單獨的檔案來管理。就像你為表單和資料庫模型建立的檔案一樣,你可以把它命名為extensions。py。
extensions。py
from
flask_bootstrap
import
Bootstrap
bootstrap
=
Bootstrap
()
# 不傳入程式例項
然後像上面一樣在create_app()裡初始化:
from
flask
import
Flask
from
extensions
import
bootstrap
from
config
import
config
def
create_app
(
config
):
app
=
Flask
(
__name__
)
app
。
config
。
from_object
(
config
)
bootstrap
。
init_app
(
app
)
return
app
你可能會對上面的各種名稱感到疑惑,比如為什麼所有的擴充套件都有一個init_app()方法,為什麼擴充套件的名稱(flask-bootstrap),匯入的名稱(flask_bootstrap),匯入的擴充套件類的名稱(Bootstrap)都有相同的命名模式?嗯,答案很簡單,因為這是Flask擴充套件開發文件裡的要求……
相關連結
程式工廠函式:
http://
flask。pocoo。org/docs/0。
11/patterns/appfactories/#factories-extensions
Flask擴充套件開發:
http://
flask。pocoo。org/docs/0。
11/extensiondev/
Flask擴充套件文件:
http://
flask。pocoo。org/docs/0。
11/extensions/
Flask extensions registry:
http://
flask。pocoo。org/extensi
ons/
- - - - -
更多關於Flask和Web開發的原創內容,歡迎關注知乎專欄 - Hello, Flask!。