为了验证中间件功能和函数执行过程,手动注册3个中间件到setting.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',
'Middle.m1.Middle1',
'Middle.m1.Middle2',
'Middle.m1.Middle3',
]

3个中间件代码

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse class Middle1(MiddlewareMixin):
def process_request(self,request):
print('第一个中间件的请求函数') def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs):
# url(r'^user_list\d+', views.user_list)
# callback_func_args --> 存没有变量名的参数
# url(r'^user_list(?P<nid>\d+)', views.user_list)
# callback_func_kwargs --> 存有变量名的参数
print('第一个中间件的视图函数') def process_exception(self, request, exception):
#如果views.py函数执行出错,自动执行
if isinstance(exception, ValueError):
print('第一个中间件的异常处理函数') def process_response(self,request,response):
print('第一个中间件的回复函数')
return response def process_template_response(self, request, response):
#默认不执行
#如果views返回的对象中具有render方法,该方法自动执行 print('第一个中间件的模板函数')
return response class Middle2(MiddlewareMixin):
def process_request(self,request):
print('第二个中间件的请求函数') def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs):
print('第二个中间件的视图函数') def process_exception(self, request, exception):
if isinstance(exception, ValueError):
print('第二个中间件的异常处理函数')
# return HttpResponse("发生ValueError错误。。。") def process_response(self,request,response):
print('第二个中间件的回复函数')
return response def process_template_response(self, request, response):
print('第二个中间件的模板函数')
return response class Middle3(MiddlewareMixin):
def process_request(self,request):
print('第三个中间件的请求函数') def process_view(self,request, callback_func, callback_func_args, callback_func_kwargs):
print('第三个中间件的视图函数') def process_response(self,request,response):
print('第三个中间件的回复函数')
return response def process_exception(self, request, exception):
if isinstance(exception,ValueError):
print('第三个中间件的异常处理函数')
#return HttpResponse("发生ValueError错误。。。") def process_template_response(self, request, response):
print('第三个中间件的模板函数')
return response
#render方法的执行
class Foo():
def render(self):
return HttpResponse("<h1>readding a book!!</h1>")
def read(request):return Foo()

加入中间件后的请求周期

完整的请求周期:
  request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) ->
  view1 -> view2 -> view3 -> views中的函数 -> response3 -> response2 -> response1 request函数return:
Django1.8、1.9之前:request1 -> request2(return) ->response3 -> response2 -> response1
Django1.10之后:request1 -> request2(return) -> response2 -> response1 views.py中的函数执行报错(exceptionX不return):
request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) ->
view1 -> view2 -> view3 -> views中的函数异常 -> exception3 -> exception2 -> exception1 ->
response3 -> response2 -> response1 views.py中的函数执行报错(exception2--->return):
request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) ->
view1 -> view2 -> view3 -> views中的函数异常 -> exception3 -> exception2 ->
response3 -> response2 -> response1 加上template函数之后的请求周期:
#template只有在views.py中执行了render方法后才会被调用,并且他自己也必须要返回response
request1 -> request2 -> request3 -> 路由映射匹配(获取view中的回调参数) ->
view1 -> view2 -> view3 -> views中的函数 ->
template3 -> template2 -> template1 ->
response3 -> response2 -> response1
 

Django学习-18-中间件的更多相关文章

  1. Django 学习之中间件Middleware

    一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...

  2. django 学习-18 用户管理Auth系统使用

    1.首先跟之前说的admin的要求有点像, vim urls.py from django.contrib import adminadmin.autodiscover()               ...

  3. django学习-18.*args和**kwargs的用法和使用场景

    目录结构 1.前言 2.[*args]的用法 2.1.第一步:首先编写这样的函数[test1]. 2.2.第二步:给函数[test1]赋值相关入参值. 2.3.第三步:调用函数[test1],得到以下 ...

  4. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  5. Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程

    这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...

  6. Django 学习笔记(五)模板标签

    关于Django模板标签官方网址https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.IF标签 Hello World/vi ...

  7. Django 学习笔记(四)模板变量

    关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...

  8. Django 学习笔记(七)数据库基本操作(增查改删)

    一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...

  9. Django学习(3)模板定制

    在Django学习(一)一首情诗中,views.py中HTML被直接硬编码在代码之中,虽然这样便于解释视图是如何工作的,但直接将HTML硬编码到视图却不算一个好主意.因为: 对页面设计进行的任何改变都 ...

  10. Django学习笔记(2)——模型,后台管理和视图的学习

    一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...

随机推荐

  1. LANMP系列教程之MySQL编译安装CentOS7环境

      以MySQL5.5.33版本为例 1.准备工作: 1.首先准备好源代码包 2.并且确保已安装好 "开发工具" 包组和cmake编译工具 3.确保安装好ncurses-devel ...

  2. git的一些常见命令

    一.新建代码库 # 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码 ...

  3. POJ 3581 Sequence [后缀数组]

    Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6911   Accepted: 1543 Case Tim ...

  4. Leetcode刷题C#版之 Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  5. 一个.net专业户转Spring Boot V2.0开发的体会

    java web的idea开发工具总体用起来还是比vs差很多,但是在使用Hibernate跟MyBatis的感触,Hibernate有着.net core ef没有的细腻,Hibernate在细节上完 ...

  6. python学习:简单的wc命令实现

    #!/usr/bin/python   import sys import os   try:     fn = sys.argv[1] except IndexError:     print &q ...

  7. 整理的linux面试运维题

    如何在非交互模式下把 /home/example/下所有.conf文件中的 192.168.0.2 改成 db01 ?   find /home/example/ -type f -name &quo ...

  8. centos 6.8 下安装redmine(缺陷跟踪系统)

    一.实验环境 centos6.8 64位 所需安装包: ruby-2.3.4.tar.gz.rubygems-1.8.25.tgz.redmine-2.3.2.tar.gz 二.安装步骤 1.安装必要 ...

  9. 手把手教你树莓派实现简易室内监控系统(C)之BOA服务器的搭建

    本篇主要讲利用BOA服务器做室内监控系统的服务器端. 古人云:万事开头靠百度,实在不行就Google.小编也是一步一步的,亲自搭建成功,不能说是万全之策,仅仅是给大家一个参考就满足了. 第一步: 1. ...

  10. Egret学习笔记 (Egret打飞机-2.开始游戏)

    打开 Egret Wing,新建一个Egret游戏项目,然后删掉默认生成的createGameScene方法里面的东西 然后新建一个BeginScene.ts的文件,作为我们的游戏的第一个场景 cla ...