【一】引入
- 我們在Django的配置檔案中,裡面的中介軟體配置檔案雖然使用逗號分開,但是可以直接映入到某個模組
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
【二】推導過程
-
以一個多平臺傳送訊息為例子
-
首先需要向django中介軟體一樣定義一個列表
# 這裡我寫在一個setting.py檔案裡面
# 列表裡面的字串就是對應模組的路徑
NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat',
]
# 然後我又建立了一個notify包,裡面寫了三個py檔案分別定義了對應的類
--notify
--__init__.py
--email.py
--qq.py
--wechat.py
# 三個模組的內容,都類似於這樣,按照鴨子型別都寫一個sent方法
class Email:
def __init__(self):
pass
def send(self, content):
print(f'email通知:>>>{content}')
# 最關鍵的部分在__init__.py 這裡
# 匯入配置檔案以獲取那個列表
from file import settings
# 匯入模組,以達到字串匯入模組的方法
import importlib
# 定義一個函式來傳送訊息
def send_all(content):
# 用for迴圈得到每一個字串
for path_str in settings.NOTIFY_LIST:
# 利用字串切割的方法分別得到功能模組的路徑和功能類名稱
module_path, class_name = path_str.rsplit('.', maxsplit=1)
# 1.利用字串匯入模組
module = importlib.import_module(module_path)
# 2.利用反射獲取類名
cls = getattr(module, class_name)
obj = cls()
obj.send(content)
# 最後再定義一個啟動檔案start.py
import notify
notify.send_all('我開心就好')