Keeping up with the django - 插拔式設計 | Python 主題月

本文正在參加「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('下課啦')
複製代碼

方式二:面向對象函數

  • 借鑑django中間件的思路,每一個功能獨享一個py文件,所有放在一個目錄下。
  • 建立一個settings.py配置文件,將須要被導入的模塊中的具體對象的路徑以字符串的方式寫入列表。
  • 在存放功能的文件夾下的每一個py文件都是一個功能模塊,因此該文件夾就是一個包,因此就須要在該文件夾下在建立__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

image.png

相關文章
相關標籤/搜索