Django学习-18-中间件

时间:2022-09-17 10:41:24

为了验证中间件功能和函数执行过程,手动注册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&period;&ast;args和&ast;&ast;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&plus;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. 关于C&num;消息调度(作业日志)

    在Windows定时作业中,其实有多种关于作业调度形式,比如Windows Services 和 Windows Form 都可以做到,各有各的好处.现在来介绍下使用插件的形式进行定时作业. 1.用q ...

  2. Oracle EBS Setup

    1. Prevent close other forms after close original form

  3. 谷歌 Uncaught SecurityError&colon; Failed to execute &&num;39&semi;replaceState&&num;39&semi; on &&num;39&semi;History 错误

    今天在用sui mobil做一个内联页面的时候遇到了这个问题. 然而这个问题只出现在chrome浏览器中,在火狐中没有一点问题. 他说明的是一个安全问题,chrome中有了新的安全机制

  4. html multiple select option 分组

    普通html方式展示<select name="viewType" style="width: 100%;height: 300px;" multiple ...

  5. 对JavaScript中的静态属性和原型属性的理解

    首先是在访问上的区别,当访问实例对象的某个属性但它本身没有时,它就会到原型中去查找,但不会去查找静态属性. // 实例对象不会去查找静态属性 function Foo(){} Foo.a = 1; v ...

  6. 深入剖析Tomcat类加载机制

    1JVM类加载机制 JVM的ClassLoader通过Parent属性定义父子关系,可以形成树状结构.其中引导类.扩展类.系统类三个加载器是JVM内置的. 它们的作用分别是: 1)引导类加载器:使用n ...

  7. CTF杂项之音频隐写

    题目来自bugku 二话不说,直接上图 由题目可以看出,这题需要用到一个KEY,加上又是一段音频,很容易联想到一个著名的音频隐写解密软件Mp3stego 直接上工具 ok,成功Get Flag

  8. JavaScript 最终将在编程语言中占统治地位?

    JavaScript 最终将在编程语言中占统治地位? JavaScript 现在是大多数开发者都会使用的编程语言.网络效应会推动它成为有史以来第一个真正占统治地位的编程语言吗? 大约十年前,编程的方式 ...

  9. Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

    1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地Ngin ...

  10. content-type&colon; application&sol;json没有设置导致的500错误

    $.ajax({ url:'http://xxx.test', type: 'Post', data: JSON.stringify(model), dataType: 'json', content ...