首页 > 其他 > 详细

Django之中间件

时间:2019-09-25 21:04:31      阅读:119      评论:0      收藏:0      [点我收藏+]

一:中间件基础简介

(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

  (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属性才会触发

 

Django之中间件

原文:https://www.cnblogs.com/SR-Program/p/11586753.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!