本文正在參加「Python主題月」,詳情查看 活動連接前端
微信公衆號搜索【程序媛小莊】 - 沒有白走的路,每一步都算數python
在django全棧項目中,前端向後端提交post請求時須要註釋csrf
校驗,將代碼註釋以後就無需進行校驗了,如何實現只註釋一行代碼就能夠註釋掉整個功能呢?本文將介紹插拔式設計
是如何實現的?web
插拔式設計
實現須要藉助一個模塊importlib
,該模塊能夠將字符串類型的路徑轉換爲導入模塊的語法格式。django
# 導入模塊的常規寫法
from module import object
# 使用importlib
import importlib
res = 'myfile.test'
ret = importlib.import_module(res) # from myfile import b
複製代碼
能夠經過這種代碼設計方式模擬一下通知消息,簡約版微信 QQ 短信等同時發送,而且能夠很方便的關閉某一種通知渠道。後端
方式一:常規思路微信
建立一個py
文件,將每一個功能定義爲一個函數,再建立一個啓動文件,將定義的功能導入,在啓動文件中運行。markdown
myfile文件夾
- notify.py
def wechat(content):
print(f'微信通知:{content}')
def message(content):
print(f'短信通知:{content}')
def qq(content):
print(f'qq通知{content}')
- start.py
import notify
def send(content):
notify.wechat(content)
notify.message(content)
notify.qq(content)
if __name__ == '__main__':
send('下課啦')
複製代碼
方式二:面向對象函數
__init__.py
文件,將每個功能模塊的名字都放在該py文件下__init__.py
文件中,經過for循環 + 鴨子類型 +字符串方法+反射就能夠實現django中settings.py中只須要添加註釋或者解除註釋就能夠實現某種功能的添加或者刪除# notify文件夾就是包
- email.py
class Email():
def __init__(self):
# 調用應用接口
pass
def send(self,content):
print(f'email{content}')
- qq.py
class QQ():
def __init__(self):
# 調用應用接口
pass
def send(self,content):
print(f'qq{content}')
-wechat.py
class Wechat():
def __init__(self):
# 調用應用接口
pass
def send(self,content):
print(f'wechat{content}')
- settings.py
NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat'
]
- __init__.py
import settings
import importlib
def send_all(content):
for path_str in settings.NOTIFY_LIST: #'notify.email.Email'
module_path,class_name = path_str.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
import notify
if __name__ == '__main__':
notify.send_all('haha')
複製代碼
文章首發於微信公衆號程序媛小莊,同步於掘金。post
碼字不易,轉載請說明出處,走過路過的小夥伴們伸出可愛的小指頭點個贊再走吧(╹▽╹)ui