一個小型的Flask應用的目錄結構一般是這樣的
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
上面結構非常適合小型項目,但對大型項目來說,我們一般會用包來表示模塊,這有個示例就是用包的形式構建的。
包結構
對更大一點的項目,我們僅僅需要在yourapplication裏創建一個同名文件夾,並把所有內容移動到新的yourapplication裏面。 將yourapplication.py 重命名爲__init__.py。(確定此前已經刪除了所有的.pyc文件,否則很可能會崩潰)
這樣,新的目錄結構如下:
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
但是application的運行與以前不同,直接執行python yourapplication/__init__.py不會起作用。這說明Python不希望把包裏面的modules當做一個啓動文件。我們只需要在內層的yourapplication文件夾中創建一個setup.py文件,setup.py的內容如下:
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
爲了運行application我們還需要導出一個環境變量:
$ export FLASK_APP=yourapplication
確定當前的工作目錄是否在項目的文件夾下,與上面相似可以用如下命令開啓開發模式:
$ export FLASK_ENV=development
執行如下命令,運行application:
$ pip install -e .
$ flask run
這樣做有什麼用?現在我們能夠將一個application重構成多module的形式。我們只需要注意如下問題:
- 1 Flask的application對象必須在__init__.py中創建,這種方式能夠讓每一個module都能夠引入它。
- 2 所有的view方法(在頂部有route()裝飾的方法)均在__init__.py文件中被引入,__init__.py引入這些文件要在application對象創建後。
__init__.py的示例代碼:
from flask import Flask
app = Flask(__name__)
import yourapplication.views
所有的view.py文件要想下面這樣:
from yourapplication import app
@app.route('/')
def index():
return 'Hello World!'
最終得到的目錄結構如下
/yourapplication
setup.py
/yourapplication
__init__.py
views.py
/static
style.css
/templates
layout.html
index.html
login.html
循環Import
python項目中不希望出現循環Import,當剛剛我們添加了循環Import(兩個module互相依賴,在示例中__init__.py和view.py互相依賴)。通常情況下這種寫法很差,但在這裏非常適合。原因是因爲在__init__.py中我們並沒有真正的去使用views,僅僅是確保modules被引入進來,並且,我們的import代碼放在了__init__.py文件的底部。
使用Blueprints
如果是一個更大的項目,推薦使用Blueprints。