基于django中间件的编程思想

基于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的中间件编写思路,其实就类似于上述的操作!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于django中间件的编程思想 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 轮播图前端

    轮播图组件 <template> <div id=”banner”> <el-carousel height=”400px”> <!– 将banner_list循环–> <el-carousel-item v-for=”item in banner_list” :key=”item”> <…

    2023年4月2日
    00
  • 基于tcp协议的套接字通信

    1、套接字socket简介 Socket是应用层与TCP/UDP协议通信的中间软件抽象层,它充当一种接口的角色!封装了传输层以下的东西。 1.1基于tcp的socket通信流程图 2.tcp服务端搭建 需求:模拟两个手机的通话 from ipaddress import IPv4Address import socket # 1.买手机 # socket.A…

    2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
  • django中的request对象方法

    1.什么是request对象 在django中,当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象;Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。 2.request对象的作用 request对象里面封装了请求时拿到的数据,我们可以通过request.的…

    Python开发 2023年4月2日
    00
  • 操作系统启动流程和BIOS介绍

    1.BIOS介绍 我们刚刚买回来的电脑裸机是可以直接启动的,这是由于生产厂商在电脑出厂的时候就在电脑里编写了一个只可读的系统功能BIOS,该系统被写入了ROM(只读内存中) BIOS是一个过渡性的操作系统,当安装了window等其他操作系统时,该系统会被快速的代替 2.操作系统的启动流程 1.计算机通电2.BIOS开始运行,检测硬件:cpu、内存、硬盘等3.…

    2023年4月2日
    00
  • 小程序子页面向父页面传值、腾讯云对象存储上传图片

    1. 页面传值 1.1 父页面向子页面传值 父页面: /pages/xx/xxx?id=1 子页面 // option就可以接收到父页面传来的值 onLoad:function(option){ } 1.2 子父页面 子页面 var pages = getCurrentPages() var prevPage = pages[pages.length-2] …

    Python开发 2023年4月2日
    00
  • 基础数据类型之字典

    1.字典的定义 使用{}定义字典,括号内用逗号分隔开多个key:value,其中value可以是任意类型,但是key必须是不可变类型且不能重复,是无序的! info=[ [‘name’,’zhang’], (‘age’,19) [‘gender’,’男’] ] d={} # 第一种方式定义 d=dict(x=1,y=2) #第二种,dict里面也可以穿一个i…

    Python开发 2023年4月2日
    00
  • admin后台管理数据库里的表

    admin后台管理 django给您提供了一个可视化图形界面,来方便您来对数据库里的表进行增删改查的管理 但是!使用admin后台管理你自己注册的模型表时,需要自行进行先注册该表! 在应用下的admin.py里进行注册: from django.contrib import admin from app01 import models # Register …

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部