Flask 大型應用

2021-08-11 09:44 更新

對于比較大型的應用,更好的做法是使用包管理代碼,而不是模塊來管理代碼。 這非常簡單,設想一個如下結構的應用:

/yourapplication
    /yourapplication.py
    /static
        /style.css
    /templates
        layout.html
        index.html
        login.html
        ...

簡單的包

將一個項目改為一個更大的包,僅僅創(chuàng)建一個新的 yourappication 文件夾在 已存的文件夾下面,然后將所有的的文件都移動到它下面。之后將 yourapplication.py 重命名為 __init__.py (確保先刪除了其中所有的 .pyc 文件,否則可能導致 錯誤的結果)

您最后得到的東西應該像下面這樣:

/yourapplication
    /yourapplication
        /__init__.py
        /static
            /style.css
        /templates
            layout.html
            index.html
            login.html
            ...

如何在此種方式下運行您的應用?原來的 python yourapplication/__init__.py 不能再工作了。這是由于 Python 不希望在包中的模塊成為初始運行的文件。但這 不是一個大問題,僅僅添加一個名叫 runserver.py 的新文件,把這個文件放在 yourapplication 文件夾里,并添加如下功能:

from yourapplication import app
app.run(debug=True)

然后,我們又能對應用做什么呢?現在我們可以重新構造我們的應用,將其 改造為多個模塊。你唯一需要記住的就是下面的速記備忘表:

  1. Flask 程序對象的創(chuàng)建必須在 __init__.py 文件里完成, 這樣我們就可以安全的導入每個模塊,而 __name__ 變量將 會被分配給正確的包。
  2. 所有(上面有 route() 裝飾器的那些)視圖函數必須 導入到 __init__.py 文件。此時,請通過模塊而不是對象本身作為路徑 導入這些視圖函數。必須在應用對象創(chuàng)建之后 導入視圖模塊。

這里是 __init__.py 的一個例子:

from flask import Flask
app = Flask(__name__)

import yourapplication.views

views.py 應該看起來像這樣:

from yourapplication import app

@app.route('/')
def index():
    return 'Hello World!'

您最終應該得到的程序結構應該是這樣:

/yourapplication
    /runserver.py
    /yourapplication
        /__init__.py
        /views.py
        /static
            /style.css
        /templates
            layout.html
            index.html
            login.html
            ...

循環(huán)導入

每個 Python 程序員都會討厭他們,而我們反而還添加了幾個進去: 循環(huán)導入(在兩個模塊相互依賴對方的時候,就會發(fā)生循環(huán)導入)。在這里 views.py 依賴于 __init__.py。通常這被認為是個不好的主意,但是 在這里實際上不會造成問題。之所以如此,是因為我們實際上沒有在 __init__.py 里使用這些視圖,而僅僅是保證模塊被導入了。并且,我們是 在文件的結尾這么做的。

這種做法仍然有些問題,但是如果您想要使用修飾器,那么沒有 其他更好的方法了。檢查 聚沙成塔 這一章來尋找解決 問題的些許靈感吧。

與藍圖一起工作

如果您有規(guī)模較大的應用,建議您將他們分拆成小的組,讓每個組 接口于藍圖提供的輔助功能。關于這一主題進一步的介紹請參考 用藍圖實現模塊化的應用 這一章節(jié)的文檔


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號