基于django中間件的編程思想
在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',
]
這種形式的中間件,當我們注釋掉其中的一行字串時,它對應的中間件就失效了,打開注釋時,對應的中間件又全域生效了,
這種方式的作業原理是什么呢?

我們通過下面的一個小案例來了解一下其作業原理:
案例的需求:定義三個功能,三個功能分別是短信發送內容、qq發送內容、郵箱發送內容,把其也寫成串列套字串的形式,當注釋掉其中一種功能時,該功能就失效,

# 第一步:在一個包里面創建三個py檔案,分別定義一個對于功能的類
class Email:
def __init__(self):
pass
def send(self,content):
print('郵箱發送%s'%content)
class Msg:
def __init__(self):
pass
def send(self, content):
print('資訊發送%s' % content)
.....
# 第二步:創建一個setting.py
CONTENT_LIST = [
# 'notify.email.Email',
'notify.msg.Msg',
'notify.qq.Qq'
]
# 第三步:在包里面的__init__檔案里面,對于setting里面的串列字串回圈,從而得到對于的模塊和類名,在函式里回圈一次就呼叫一次對應類里面的方法
import setting
import importlib
def send_all(content):
for path in setting.CONTENT_LIST: # path 每次回圈得到的是'notify.email.Email'的字串
module_path,class_name = path.rsplit('.',maxsplit=1) # 從右往左切一個,然后在拆包
# module_path = 'notify.email' class_name = 'Email'
# 1 利用字串匯入模塊
module = importlib.import_module(module_path) # from notify import email
# 2 利用反射獲取類名
cls = getattr(module,class_name) # Email、QQ、Wechat
# 3 生成類的物件
obj = cls()
# 4 利用鴨子型別直接呼叫send方法
obj.send(content)
# 第四步:創建一個start.py檔案,用于啟動notify檔案里的功能
import notify
notify.send_all('快下課了') #去notify的__init__里找對應的函式呼叫
以后如果需要不用那種功能,只需要注釋掉setting里面的字串就行,這樣就真正的解耦合了!!
django的中間件撰寫思路,其實就類似于上述的操作!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502386.html
標籤:其他
上一篇:字典(dict)
