**不重要,重要的是這個思想
說白了就是想做到想 注釋中介軟體一樣,存在的時候,全域性都會走那個中介軟體,不要用的時候注釋掉,除了不實現那個功能之外對全域性都不會有影響。
這就是可插拔式設計。
首先講解乙個模組importlib
這個模組的作用:以字串的形式匯入模組
module = 'file.a'
importlib.import_module(module)
上面這句就等於下面這句
from file import a
接下來就可以講一下可插拔式設計了。
首先建乙個包notify,包裡面有四個py檔案,init.py email.py msg.py wechat.py
然後在根目錄下寫兩個py檔案 ,乙個是 run.py 乙個是settings.py
print('郵件通知:%s'%content)
msg.py
class msg():
def __init__(self):
pass
def send(self,content):
print('簡訊通知:%s'%content)
wechat.py
class wechat():
def __init__(self):
pass
def send(self,content):
print('vx通知:%s'%content)
最重要的乙個py檔案
import settings
import importlib
def send_all(content):
for module_path in settings.notyfy_list:
module, class_name = module_path.rsplit('.',maxsplit=1)
mod = importlib.import_module(module)
# 上面這句等於from notify import email
cls = getattr(mod,class_name) #利用反射獲取模組種類的變數名
obj = cls()
obj.send(content)
總體講解:
首先寫乙個資料夾notify,在這個資料夾裡面寫了三個py檔案,分別用物件導向的方式在每個檔案裡面寫了三個通知的類,每個類都有乙個send方法,用來被呼叫。然後去settings檔案裡面把這三個類的路徑以字串的形式配置好。
然後,最重要的一步開始了,在notify資料夾裡寫了乙個__init__.py檔案,這就讓這個資料夾變成了包。匯入這個包的東西,就只用匯入這個init就行。前提是在init裡面吧那三個py檔案匯入了先。
在init 裡匯入了settings裡的配置好的字串路徑,迴圈這個字串列表,然後通過這句module, class_name = module_path.rsplit('.',maxsplit=1) 切片,module拿到的就是notify.email ,class_name拿到的就是email
然後通過importlib.import_module(module),得到的結果就是那個模組,在這裡也就是email模組。 然後又通過反射,獲取在這個模組裡的類的變數名,用cls來接收,迴圈的第一次就是 email這個類,然後obj = cls()例項化生成了乙個物件,obj.send(content)就執行了他的方法,列印了一條結果,settings裡配置了幾個,就列印幾個結果。當然我們要執行的檔案是 run檔案,run裡面就只用匯入這個包,就相當於匯入了這個包的 init 檔案,直接notify.send_all('輸出我要輸入的字元') 就行了。
這樣一來就實現了可插拔式設計,**不重要,重要的是這個思想。
自定義中介軟體
建立乙個mymiddleware.pydef middleware get response 中介軟體工廠,生成乙個中介軟體 get response 此處編寫的 僅在django第一次配置和初始化的時候執行一次。print 1,初始化中介軟體了.def middleware request 此處編...
laravel 自定義中介軟體
關於中介軟體的理解 最好將中介軟體想象為一系列的 層 http 請求必須經過它們才會觸發您的應用程式。每一層都可以檢測接收的請求,甚至可以完全拒絕請求訪問您的應用。1.建立中介軟體php artisan make middleware checkage 3.為路由指定中介軟體 route get f...
scrapy中介軟體自定義
二 定義動態proxy中介軟體 在middlewares.py檔案中,編寫useragentmiddlerware中介軟體,可以隨機動態設定user agent from fake useragent import useragent 自定義動態user agent中介軟體 class userag...