Flask 大型應(yīng)用

2021-08-23 18:41 更新

對(duì)于比較大型的應(yīng)用,更好的做法是使用包管理代碼,而不是模塊來(lái)管理代碼。 這非常簡(jiǎn)單,設(shè)想一個(gè)如下結(jié)構(gòu)的應(yīng)用:

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

簡(jiǎn)單的包

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

您最后得到的東西應(yīng)該像下面這樣:

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

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

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

然后,我們又能對(duì)應(yīng)用做什么呢?現(xiàn)在我們可以重新構(gòu)造我們的應(yīng)用,將其 改造為多個(gè)模塊。你唯一需要記住的就是下面的速記備忘表:

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

這里是 __init__.py 的一個(gè)例子:

from flask import Flask
app = Flask(__name__)

import yourapplication.views

而 views.py 應(yīng)該看起來(lái)像這樣:

from yourapplication import app

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

您最終應(yīng)該得到的程序結(jié)構(gòu)應(yīng)該是這樣:

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

循環(huán)導(dǎo)入

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

這種做法仍然有些問題,但是如果您想要使用修飾器,那么沒有 其他更好的方法了。

與藍(lán)圖一起工作

如果您有規(guī)模較大的應(yīng)用,建議您將他們分拆成小的組,讓每個(gè)組 接口于藍(lán)圖提供的輔助功能。關(guān)于這一主題進(jìn)一步的介紹請(qǐng)參考 用藍(lán)圖實(shí)現(xiàn)模塊化的應(yīng)用 這一章節(jié)的文檔


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)