首页 > 编程语言 >基于django中间件的编程思想

基于django中间件的编程思想

时间:2022-08-20 14:57:23浏览次数:90  
标签:__ middleware 编程 中间件 send django notify

基于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',
]

这种形式的中间件,当我们注释掉其中的一行字符串时,它对应的中间件就失效了,打开注释时,对应的中间件又全局生效了。

这种方式的工作原理是什么呢?
image

我们通过下面的一个小案例来了解一下其工作原理:

案例的需求:定义三个功能,三个功能分别是短信发送内容、qq发送内容、邮箱发送内容,把其也写成列表套字符串的形式,当注释掉其中一种功能时,该功能就失效。
image

# 第一步:在一个包里面创建三个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的中间件编写思路,其实就类似于上述的操作!

标签:__,middleware,编程,中间件,send,django,notify
From: https://www.cnblogs.com/suncolor/p/16607697.html

相关文章

  • 网络编程-综合案例-文件上传原理
    文件上传原理1.【客户端】输入流,从硬盘读取文件数据到程序中。2.【客户端】输出流,写出文件数据到服务端。3.【服务端】输入流,读取文件数据到服务端程序。4.【服务端】......
  • [编程题]仓库配送(最短路, Dijskra)
    [编程题]仓库配送#最短路径,Dijskrafromcmathimportcosfromheapqimport*fromcollectionsimportdefaultdictN,K,M=list(map(int,input().strip().sp......
  • django中的中间件
    1.什么是中间件中间件是django的门户,在请求响应进入进出django的时候,都需要先经过中间件,用来全局改变django的输入和输出。django中自带7个中间件,每个中间件都有其特定......
  • [编程题]项目经理(二分图)
    项目经理参考,模板'''二分图,匈牙利算法最大匹配数:最大匹配的匹配边的数目最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择最大独立数:选取最多......
  • 网络编程-TCP通信程序(下)代码
     TCP通信的客户端:向服务器发送连接请求,给服务端发送数据,读取服务端回写的数据表示客户端的类:java.net.Socket:该类实现客户端套接字(也称为“套接字”)。套接字是两台机器......
  • PowerShell教程 - 编程结构(Program Struct)- 第二部分
    更新记录转载请注明出处。2022年8月20日发布。2022年8月15日从笔记迁移到博客。字符串(String)说明本质就是.NETSystem.Stringtype使用字符串的索引(Indexingi......
  • 中间件
                                                         ......
  • Java网络编程
    Java网络编程Java为了可移植性,不允许直接调用操作系统,而是由java.net包来提供网络功能。Java虚拟机负责提供与操作系统的实际连接。以下是java.net包中的常用的类。InetA......
  • 网络编程-TCP通信程序(上)理论
    TCP通信程序概述 TCP通信能实现两台计算机之间的数据交互通信的两端要严格区分客户端(Client)与服务端(Server)两端通信时步骤1.服务端程序需要事先启动等待客户端的链......
  • django中配置apscheduler,并解决运行两次的问题
    创建了一个独立的app,准备把定时器执行的内容放在这里pythonmanage.pystartappcron_jobs 在应用目录下创建目录autotask1.创建task.py文件,写入要执行的内容#-*-......