Django之中间件

一:中间件基础简介

(1)简介:

  (1)中间件是在视图函数执行之前与执行之后可以进行的一些额外操作

  (2)其本质是一个自定义的类 类中定义了几个方法 其会在特定的条件触发这些方法

(2)作用:

  (1):django中间件 可以用来进行身份校验 访问频率限制 权限校验

  (2):只要涉及全局校验都可以使用中间件进行校验 

(3)django默认中间件

(1)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',
]
Django默认中间件

(4)django请求生命周期

 PS:

  (1)上述当客户端的请求到达中间件的时候 其首先会查找缓存数据库

  (2)如果缓存数据库查找不到 最终到达数据库查找

  (3)当数据库将查找的数据返回 经过中间件的时候 其会将数据分成两份

  (4)一份存入缓存数据库中 一份传输给客户端

  (5)下次客户端再次获取相同的数据的时候 其不会在进行数据库查询 而是直接去缓存数据库查询

二:自定义中间件

(1)常见自定义方法

  (1)process_request(self,request)

  (2)process_view(self, request, view_func, view_args, view_kwargs)

  (3)process_template_response(self,request,response)

  (4)process_exception(self, request, exception)

  (5)process_response(self, request, response)

(2)自定义方法使用示例

(1)文件创建图解

from django.utils.deprecation import MiddlewareMixin


class MyMiddleWareM1(MiddlewareMixin):
    pass


class MyMiddleWareM2(MiddlewareMixin):
    pass

class MyMiddleWareM3(MiddlewareMixin):
    pass
中间件自定义方法

(2)process_request

from django.utils.deprecation import MiddlewareMixin


class MyMiddleWareM1(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一个自定义中间件中的 request方法')


class MyMiddleWareM2(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一个自定义中间件中的 request方法')


class MyMiddleWareM3(MiddlewareMixin):
    def process_request(self, request):
        print('我是第一个自定义中间件中的 request方法')
中间件
def index(request):
    print('index 视图函数')
    return HttpResponse('index 视图函数')

 PS:

  (1)请求来的时候 会在中间件列表中从上至下依次进行 最后走视图函数

 

 

 PS:

  (1)一旦遇到中间件返回值为HttpResponse对象的时候 就不会再继续往下执行别的中间件

  (2)前端收到的返回值 也是为中间件的返回值 而不是后端视图函数的返回值

(3)process_response

class MyMdd(MiddlewareMixin):
   
    def process_response(self, request, response):
        print('我是第一个中间件里面的process_response方法')


class MyMdd1(MiddlewareMixin):

    def process_response(self, request, response):
        print('我是第二个中间件里面的process_response方法')


class MyMdd2(MiddlewareMixin):

    def process_response(self, request, response):
        print('我是第三个中间件里面的process_response方法')
中间件

 PS:

  (1)中间件必须将response返回

  (2)response包含 后端给前端返回的消息格式

 PS:

  (1)后端进行相应的时候 中间件执行顺序 为中间件列表从下往上开始执行

(4)process_view

class MyMdd(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        print('我是第一个中间件里面的process_view方法')

class MyMdd1(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        print('我是第二个中间件里面的process_viewe方法')


class MyMdd2(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        print('我是第三个中间件里面的process_view方法')
中间件

 PS:

  (1)其会在执行视图函数之前触发该方法

  (2)在触发该方法的时候 会拿到后端视图函数的内存地址

(5)process_exception

class MyMdd(MiddlewareMixin):
    def process_exception(self, request, exception):
        print(exception)  # name 'asdasdasd' is not defined
        print('我是第一个中间件里面的process_exception方法')


class MyMdd1(MiddlewareMixin):
    def process_exception(self, request, exception):
        print('我是第二个中间件里面的process_exception方法')


class MyMdd2(MiddlewareMixin):
    def process_exception(self, request, exception):
        print('我是第三个中间件里面的process_exception方法')
中间件
def index(request):
    print('index 视图函数')
    asdasdasd
    return HttpResponse('index 视图函数')
# 结果展示
index 视图函数
  
我是第三个中间件里面的process_exception方法
    
我是第二个中间件里面的process_exception方法
 
name 'asdasdasd' is not defined
我是第一个中间件里面的process_exception方法

PS:

  (1)其会在后端代码运行错误的时候触发该方法运行

  (2)中间件执行顺序 在中间件列表自上而下执行

(6)process_template_response

def index(request):
    print('我是index视图函数')

    def render():
        return HttpResponse('什么鬼玩意')

    obj = HttpResponse('index')
    obj.render = render
    return obj

PS:

  (1)当你返回的HttpResponse对象中必须包含render属性才会触发

 

posted @ 2019-09-25 19:05  SR丶  阅读(229)  评论(0编辑  收藏  举报