# Web
from flask import Flask
def create_app(dao): # 類似一個(gè)框架
app = Flask(__name__)
@app.route('/')
def hello_world():
return dao.data # 這里dao是個(gè)抽象,凡是含有data的dao實(shí)例都可以
return app
class DAO:
def __init__(self):
self.data = 'hello world'
the_app = create_app(DAO())
class NewDao:
def __init__(self):
self.data = 'good bye, world!'
def test_dao():
app = create_app(NewDao()) # 可以將dao注入進(jìn)去
app.run()
if __name__ == '__main__':
test_dao()
# 推薦workers=cpu*2+1
# gunicorn --workers=9 app:the_app -b 0.0.0.0:9000
定義一個(gè)create_app(dao)的好處是:
在測(cè)試中猪瞬,每個(gè)單元測(cè)試可以單獨(dú)調(diào)用一次 create_app 函數(shù),得到一個(gè)單獨(dú)的 Flask 實(shí)例入篮,然后create_app(dao)的參數(shù) dao 可以是單獨(dú)實(shí)現(xiàn)的陈瘦。
這樣第一不用管 Flask 的 handler 和 DAO Class 的源代碼依賴,因?yàn)樗麄冎g沒有依賴了潮售。handler 現(xiàn)在只依賴于一個(gè)有 data 成員的對(duì)象痊项,而不是 DAO Class 的實(shí)例锅风。
第二,因?yàn)闇y(cè)試沒有依賴于同一個(gè)全局變量鞍泉,所以每個(gè)測(cè)試也是相互獨(dú)立的皱埠。不用擔(dān)心自己對(duì)數(shù)據(jù)的操作會(huì)影響其他測(cè)試。
參考:
設(shè)計(jì)范式之依賴注入:一個(gè) Python Flask 的例子https://juejin.im/post/5c6e023d6fb9a049ba422ab8