• Django中间件


    1.中间件概述

    (1)中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

    settings.py内的中间件:

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

    (2)中间件的执行过程

    在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

    Django1.9版本以后中间件的执行流程

    1、执行完所有的request方法 到达视图函数。

    2、执行中间件的其他方法

    3、经过所有response方法 返回客户端。

    注:如果在其中1个中间件里 request方法里 return了值,就会执行当前中间件的response方法,返回给用户 然后 报错。。不会再执行下一个中间件。

    2.自定义中间件

    (1)在project下随便创建一个py文件

    (2)在setings文件中 注册这个 py文件

    django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件

     注意 自定义的中间件request 方法不要return  因为返回值中间件不再往下执行,导致 http请求到达不了视图层,因为request在视图之前执行

    from django.utils.deprecation import MiddlewareMixin
    class Middle1(MiddlewareMixin):
        def process_request(self,request):
            print("来了") #不用return Django内部自动帮我们传递
        def process_response(self, request,response):
            print('走了')
            return response #执行完了这个中间件一定要 传递给下一个中间件

    3.中间件的5个方法

    中间件中可以定义5个方法,分别是:

    • process_request(self,request)
    • process_view(self, request, callback, callback_args, callback_kwargs)
    • process_template_response(self,request,response)
    • process_exception(self, request, exception)
    • process_response(self, request, response

    由于中间件工作在 视图函数执行前、执行后,适合所有的请求/一部分请求做批量处理

    1、做IP限制

    2、URL访问过滤

    3、缓存

  • 相关阅读:
    是什么原因导致了以下错误:javascript中的“string.split不是一个函数”?
    ajax获取后台返回的数据中午乱码是怎么回事
    [Javascript] Create an Async Generator and Loop Through Generated Promises with "For Await Of" Loops
    [Ramda] Lens in Depth
    [Javascript] Multiply Two Arrays over a Function in JavaScript
    [Cypress] install, configure, and script Cypress for JavaScript web applications -- part3
    [Cypress] install, configure, and script Cypress for JavaScript web applications -- part2
    [Cypress] install, configure, and script Cypress for JavaScript web applications -- part1
    [Testing] JavaScript Mocking Fundamentals
    [CSS] Useful CSS tool for Web designer and developer
  • 原文地址:https://www.cnblogs.com/cky-2907183182/p/11461127.html
Copyright © 2020-2023  润新知