之前在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!。