W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
一個基于 WSGI 的 Python web 應(yīng)用必須有一個中央的可調(diào)用對象來實現(xiàn)實際的應(yīng) 用。在 Flask 中,這是一個 Flask 類的實例。每個 Flask 應(yīng)用 必須創(chuàng)建一個該類的實例,并傳給它模塊的名稱,但是為什么 Flask 不自己這么 做?
當不是像下面的代碼這樣使用一個顯式的應(yīng)用對象時:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!'
看起來會是這樣:
from hypothetical_flask import route
@route('/')
def index():
return 'Hello World!'
這樣做有三個主要的原因。最重要的一個是,顯式的應(yīng)用對象需要在同一時刻只存在 一個實例。有許多方法來用單個應(yīng)用對象來仿造多個應(yīng)用,像維護一個應(yīng)用的棧一樣, 但這會導(dǎo)致一些問題,這里不會贅述?,F(xiàn)在問題是:什么時候一個微框架在同一時刻需 要至少一個應(yīng)用?一個很好的例子是單元測試。當你想要測試什么的時候,創(chuàng)建一個 最小化的應(yīng)用來測試特定的行為非常有用。當應(yīng)用對象刪除時,它分配的一切都會被 再次釋放。
當你的代碼中有一個顯式的對象時,繼承基類( Flask )來更改 特定行為將成為可能。如果基于一個不暴露給你的類的對象在你之前創(chuàng)建,這么做只 能通過 hack 。
此外, Flask 依賴于一個那個類的顯式實例還有一個非常重要的原因是:包名稱。無 論何時你創(chuàng)建一個 Flask 實例,你通常傳給它 __name__ 作為包名。 Flask 依賴 這個信息來正確地加載相對于你模塊的資源。在 Python 對反射的杰出支持下,它可 以訪問包來找出模板和靜態(tài)文件存儲在哪(見 open_resource() )。當前顯然有許多框架不需要任何配置,且能載入相對于你應(yīng)用的模塊的模板。但 是它們需要為此使用當前工作目錄,一種非常不值得信賴的決定應(yīng)用在哪的方式。當 前工作目錄是進程間的,而且如果你想要在同一個進程中運行多個應(yīng)用(這會在你不 知道的一個 web 服務(wù)器中發(fā)生),路徑會斷開。更可怕的是:許多 web 服務(wù)器不把 你應(yīng)用的目錄,而是文檔根目錄設(shè)定為工作目錄,但兩者不一定是一個文件夾。
第三個原因是“顯明勝于隱含”。那個對象是你的 WSGI 應(yīng)用,你不需要記住別的東西。 如果你想要應(yīng)用一個 WSGI 中間件,只需要封裝它(雖然有更好的方式來這么做來不 丟失應(yīng)用對象的引用 wsgi_app() )。
此外,這個設(shè)計使得用工廠函數(shù)來創(chuàng)建應(yīng)用成為可能,這對單元測試和類似的東西 ( 應(yīng)用程序的工廠函數(shù) )十分有用。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: