zoukankan      html  css  js  c++  java
  • django 中间件

    概念

    中间件是django进行请求/响应处理的钩子框架。它是一个轻量级,低级的‘插件’系统,用于全局改变django的输入和输出。

    每一个中间件负责做一些特定的功能。

    说白了中间件就是可以使我们在执行视图函数之前或者之后都可以进行一些额外的操作。它的本质就一个自定义类,其中定义了几种方法,django框架会在特定的时间去执行这些方法。

    由于其是影响全局的,所以要谨慎使用,使用不当会影响性能.

    在django的setting.py中,有一个MIDDLEWARE_CLASS变量,其中的每一个元素就是一个中间件:

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

    上述列表中的每一个字符串其实就是一个中间件。

    自定义中间件

    中间件中可以定义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)
    以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

    前两个方法是从前往后执行的,后3个方法是从后往前执行的.

    自定义中间件(函数):

    def simple_middleware(get_response):
        # One-time configuration and initialization.
    
        def middleware(request):
            # Code to be executed for each request before
            # the view (and later middleware) are called.
    
            response = get_response(request)
    
            # Code to be executed for each request/response after
            # the view is called.
    
            return response
    
        return middleware

    自定义中间件(类):

    class SimpleMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.
    
        def __call__(self, request):
            # Code to be executed for each request before
            # the view (and later middleware) are called.
    
            response = self.get_response(request)
    
            # Code to be executed for each request/response after
            # the view is called.
    
            return response

    注册中间件
    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',
        'SimpleMiddleware',    
    ]
    将自定义的中间件加入到MIDDLEWARE列表中。
    中间件的执行流程
    process_request:
    1 process_request的执行是在执行视图函数之前执行的.
    2 当遇到多个中间件时,会按照中间件的注册顺序,从前到后执行.
    3 不同中间件传递的request都是同一个对象.
    process_reponse:
    1 process_reponse的执行是在执行视图函数之后执行的。
    2 当遇到多个中间件时,会按照注册的顺序,从后先前执行。
    3 不同的中间键传递到request都是同一个对象.
    你可以把中间件想象成一个洋葱,每个中间键类都是一个层,它覆盖了洋葱的核心,如果请求通过了洋葱的所有层,已将请求传递到下一层,一直到内核的视图,
    那么响应会在返回的过程中通过每个层.
  • 相关阅读:
    PHP 获取js中变量的方法
    Golang文件操作整理
    Golang的文件处理方式-常见的读写
    golang中文件以及文件夹路径相关操作
    服务器常用的状态码及其对应的含义
    left join on 和where条件的放置
    golang 文件导入数据追加sheet
    使用io/ioutil进行读写文件
    Go语言编程中字符串切割方法小结
    Golang学习
  • 原文地址:https://www.cnblogs.com/xiaozx/p/10512914.html
Copyright © 2011-2022 走看看