Flask——分包構建

一個小型的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。

發佈了42 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章