Django之中间件

中间件

本质就是一个自定义类,可以帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作

中间件可以定义五个方法:

  • process_request(self,request)
  • process_response(selef,request,response)
  • process_view(self,request,view_func,view_args,view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self,request,exception)

自定义中间件的步骤

1、在app下创建一个任意名称的文件夹,并在该文件夹内创建一个任意名称的py文件

2、在该py文件内创建一个类(这个类必须继承MiddlewareMixin),然后就可以根据自己的需求去自定义五个方法了(需要使用几个就写几个)

3、将该py文件下创建的类的路径以字符串的形式在配置文件中的中间件列表注册,就可以使用了

 

 自定义五个方法总结:

1、process_request方法:(有一个参数request)

   1、所有请求进来都必须走所有中间件中的process_request方法,执行顺序按照中间件配置的顺序,从上往下依次执行

  2、如果中间件没有定义该方法,则会直接跳过执行下一个中间件

  3、如果该方法返回了HttpResponse对象,那么请求将不会继续往下执行,而是直接返回

2、process_response方法:(有两个参数request、response)

  1、后端返回的响应都需要经过每一个中间件的process_response方法,经过的顺序是按照中间件配置顺序从下往上执行(跟request相反)

  2、该方法必须要返回一个HttpResponse对象:默认返回的是形参response,也可以自己定义返回对象。

注意:如果process_request方法已经有了返回HttpResponse对象,那么它会直接走自身的process_response方法向外返回,不在往下中间件执行。

 3、process_view方法:

四个参数:

request:是HttpRequest对象

view_func:是Django即将使用的视图函数(注意:它是实际函数对象,不函数的名称)

view_args:是传递给视图的位置参数的列表

view_kwargs:是传递给视图的关键字参数的字典

总结:该方法是在路由匹配成功之后执行视图函数之前执行的,执行的顺序是从上往下(跟request一样),同样,如果该方法return HttpResponse对象,那么同样不会直接往下执行其他中间件,而是直接执行自身的process_response方法,再往外执行process_response方法,最后返回给浏览器

4、process_tamplate_view方法:

  该方法是在返回的HttpResponse对象有render属性的时候才会触发,执行顺序是从下往上执行。

5、process_exception方法:

  当视图函数中出现异常的情况下触发,执行顺序是从下往上。

 

基于中间件的编程思想

通过修改settings文件的配置,从而来达到功能的增删改查。例子基于编程思想实现微信、qq、邮箱通知的群发

首先:1、将微信、qq、邮箱三个py文件放在一个包里

 

 2、在配置文件里面用字符串的形式将三个类的路径放在列表里

INFO_LIST=[
    'page.Email.Email',
    'page.QQ.QQ',
    'page.Wetchat.WetChat',
]

3、在page包里的__init__.py进行代码封装

import settings
import importlib
def send_all(text):
    #循环获取INFO_LIST列表中的内容
    for path_str in settings.INFO_LIST: #page.Email.Email

        path_dir,class_name=path_str.rsplit('.',maxsplit=1)
        #path_dir=page.Email    class_anem=Email
        #利用字符串导模块
        module=importlib.import_module(path_dir) #等价于from page import Email
        #利用反射获取类名
        cls=getattr(module,class_name)
        # print(cls)
        #创建类对象
        obj=cls()
        obj.send(text)

4、新建一个py文件,导入page包,调用page中的send_all方法就可以实现群发功能

import page
page.send_all('新年快乐')

 

posted @ 2020-10-11 20:54  NQ31  阅读(81)  评论(0编辑  收藏  举报