自定義中介軟體實現插拔設計

2022-03-11 03:41:35 字數 2454 閱讀 6715

**不重要,重要的是這個思想

說白了就是想做到想 注釋中介軟體一樣,存在的時候,全域性都會走那個中介軟體,不要用的時候注釋掉,除了不實現那個功能之外對全域性都不會有影響。

這就是可插拔式設計

首先講解乙個模組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...