Django框架之中介軟體思想

HuangQiaoqi發表於2024-03-25

【一】引入

  • 我們在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('我開心就好')

相關文章