Python Django中间件详细介绍

目录
  • 一 .中间件简介
  • 二 .编写自己的中间件
  • 三 .中间件执行流程

一 .中间件简介

中间件是Django请求/响应处理的钩子函数。它是一个轻量级的、低级的"插件系统",用于全局改变Django的输入和输出。中间件是帮助我们在视图函数执行之前都可以做一些额外的操作,它本质就是一个自定义类,类中定义几个方法,Djago框架会在特定的时候自动触发。

每个中间件负责做一些特定的功能。例如,‘django.contrib.auth.middleware.AuthenticationMiddleware’,它是用来将用户与请求关联起来。

二 .编写自己的中间件

中间件工厂是一个可调用的程序,它接受请求并返回响应。

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

  • process_request(self, request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('来自M1 process_request')
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('来自M2 process_request')
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
    def process_request(self, request):
        print('来自M1 process_request')
    def process_response(self, request, response):
        print('来自M1 process_response')
        return response
class M2(MiddlewareMixin):
    def process_request(self, request):
        print('来自M2 process_request')
    def process_response(self, request, response):
        print('来自M2 process_response')
        return response
  • process_resquest

需要一个参数request,它的返回值可以是None,也可以是HttpResponse对象,如果返回None,就继续向下走,返回HttpResponse对象就不执行视图函数直接将对象返回给浏览器。

在process_request方法中,视图函数是最后执行的,靠前的先执行。

总结:

  • 中间件的process_request方法是在执行视图函数之前执行的。
  • 当配置多个中间件时,会按照列表的索引值,从上到下依次执行。
  • 不同的中间件之间传递的request是同一个对象。
  • process_response

在执行完视图函数之后才执行,执行顺序和process_request方法相反,从下往上依次执行。

定义process_response方法时,需要传参request和response,response是视图函数返回的HttpResponse对象,如果返回一个自己定义的HttpResponse对象,浏览器接收到的也是自定义的而不是后端处理的。

  • process_view

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

该方法有四个参数

request是HttpRequest对象。

view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

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

view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数之前调用此方法,返回None或者HttpResponse对象,如果返回None,Django将继续处理这个请求,执行其他中间件的process_view方法,然后执行视图函数。如果返回HttpResponse对象,那么就不执行视图函数,而是直接掉头,执行process_response方法返回给浏览器。

process_view方法是在Django路由系统之后,视图系统之前执行的,执行顺序按照MIDDLEWARE中的注册顺序从前到后顺序执行的。

  • process_exception

process_exception(self, request, exception)

该方法两个参数:

一个HttpRequest对象

一个exception是视图函数异常产生的Exception对象。

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

  • process_template_response

process_template_response(self, request, response)

它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

三 .中间件执行流程

当有请求来时,先按照前后顺序依次执行process_request()方法,process_request如果返回None,就往下执行,如果返回一个HttpResponse对象就不执行process_request,而是执行当前层级的process_response方法,依次向上执行,返回给浏览器。例如下图中在中间件3返回了HttpResponse对象,就执行中间件3的process_response,依次往上返回给浏览器。下面的process_request,process_response都不会执行。

process_request方法都执行完,找到对应的视图函数,先不执行视图函数,而是执行中间件中的process_view方法,process_view返回None就继续依次执行,所有的process_view执行完才执行视图函数。下图中的中间件3返回了HttpResponse对象,下面的process_view方法就不执行了,直接执行最下边的process_response方法,依次向上返回给浏览器。

process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。

到此这篇关于Python Django中间件详细介绍的文章就介绍到这了,更多相关Python Django 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Django中间件使用原理及流程分析

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

  • 详解Python的Django框架中的中间件

    什么是中间件 我们从一个简单的例子开始. 高流量的站点通常需要将Django部署在负载平衡proxy之后. 这种方式将带来一些复杂性,其一就是每个request中的远程IP地址(request.META["REMOTE_IP"])将指向该负载平衡proxy,而不是发起这个request的实际IP. 负载平衡proxy处理这个问题的方法在特殊的 X-Forwarded-For 中设置实际发起请求的IP. 因此,需要一个小小的中间件来确保运行在proxy之后的站点也能够在 request.

  • Python Django中间件,中间件函数,全局异常处理操作示例

    本文实例讲述了Python Django中间件,中间件函数,全局异常处理操作.分享给大家供大家参考,具体如下: 应用名/middleware.py(定义中间件类,中间件函数.文件名可以任意): from django.http import HttpResponse # 定义中间件类. (类名可以任意,但类中的方法名是固定的) class TestMiddleware(object): '''中间件类''' def __init__(self): '''服务器重启之后,接收第一个请求时调用(只会

  • Python Django中间件详细介绍

    目录 一 .中间件简介 二 .编写自己的中间件 三 .中间件执行流程 一 .中间件简介 中间件是Django请求/响应处理的钩子函数.它是一个轻量级的.低级的"插件系统",用于全局改变Django的输入和输出.中间件是帮助我们在视图函数执行之前都可以做一些额外的操作,它本质就是一个自定义类,类中定义几个方法,Djago框架会在特定的时候自动触发. 每个中间件负责做一些特定的功能.例如,‘django.contrib.auth.middleware.AuthenticationMiddl

  • Python 模块EasyGui详细介绍

    Python 模块EasyGui详细介绍 前言: 在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使用这个模块.希望能给刚接触easygui的你一点帮助 :-) msgBox,ccbox,ynbox # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/5/25' # __

  • Python字典操作详细介绍及字典内建方法分享

    创建 方法一: >>> dict1 = {} >>> dict2 = {'name': 'earth', 'port': 80} >>> dict1, dict2 ({}, {'port': 80, 'name': 'earth'}) 方法二:从Python 2.2 版本起,可以使用一个工厂方法,传入一个元素是列表的元组作为参数 >>> fdict = dict((['x', 1], ['y', 2])) >>> f

  • python request 模块详细介绍

    request Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作. GET 请求 # 1.无参数实例     import requests     ret = requests.get('https://github.com/timeline.json')     print

  • Python 循环函数详细介绍

    目录 一.循环函数 1.for循环 2.while循环 3.中断循环 二.循环设计 1.range() 2.enumerate() 3.zip() 三.循环对象 1.什么是循环对象 2.迭代器 3.生成器 4.表推导 一.循环函数 1.for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次. 基本构造是 for 元素 in 序列: statement 举例来说,我们编辑一个叫forDemo.py的文件 for a in [3,4.4,'life']: print a

  • python中进程间通信详细介绍

    目录 进程间通信(IPC) 管道通信(Pipe) 1.通信原理 2. 实现方法 共享内存 1.通信原理 2.实现方法 信号量(信号灯集) 1.通信原理 2. 实现方法 3.代码演示 进程间通信(IPC) 必要性 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信 常用进程间通信方法 管道 消息队列 共享内存 型号 信号量 套接字 管道通信(Pipe) 1.通信原理 在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信 代码演示(w

  • python运算符号详细介绍

    目录 比较运算符 布尔运算符 python中的位运算符 运算符的优先级 比较运算符 a,b=10,30 print('a>b吗?',a>b) print('a<b吗?',a<b) print('a<=b吗?',a>=b) print(a is b)#这个比较的是id标识 a>b吗? False a<b吗? True a<=b吗? False False 一个变量有三部分组成:1标识,2类型,3值 比较对象的标识使用is 布尔运算符 print(a==1

  • Python 字典(Dictionary)详细介绍

    目录 1.访问字典里的值 2.修改字典 3.删除字典元素 3.1字典键的特性 4.字典内置函数&方法 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 格式如下所示: d = {key1 : value1, key2 : value2 } 注意:dict 作为 Python 的关键字和内置函数,变量名不建议命名为 dict. 键一般是唯一的,如果重复最后的一个键值对会替换

  • Python wheel文件详细介绍

    目录 1. wheel介绍 2. wheel的类型 3. 创建wheel 4. 导入使用wheel 1. wheel介绍 .whl文件(WHL file)也称为轮子(wheel),这是用于python分发(distribution)的标准内置包格式(standard built-package format).它包含安装所需的所有文件和元数据(metadata)..whl文件使用zip进行压缩..whl文件还包含有关此wheel文件支持的Python版本和平台的信息..whl文件格式是一种即装即

随机推荐