Django学习-18-中间件
为了验证中间件功能和函数执行过程,手动注册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-中间件的更多相关文章
- Django 学习之中间件Middleware
一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...
- django 学习-18 用户管理Auth系统使用
1.首先跟之前说的admin的要求有点像, vim urls.py from django.contrib import adminadmin.autodiscover() ...
- django学习-18.*args和**kwargs的用法和使用场景
目录结构 1.前言 2.[*args]的用法 2.1.第一步:首先编写这样的函数[test1]. 2.2.第二步:给函数[test1]赋值相关入参值. 2.3.第三步:调用函数[test1],得到以下 ...
- Django学习之七:Django 中间件
目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...
- Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程
这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...
- Django 学习笔记(五)模板标签
关于Django模板标签官方网址https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.IF标签 Hello World/vi ...
- Django 学习笔记(四)模板变量
关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...
- Django 学习笔记(七)数据库基本操作(增查改删)
一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...
- Django学习(3)模板定制
在Django学习(一)一首情诗中,views.py中HTML被直接硬编码在代码之中,虽然这样便于解释视图是如何工作的,但直接将HTML硬编码到视图却不算一个好主意.因为: 对页面设计进行的任何改变都 ...
- Django学习笔记(2)——模型,后台管理和视图的学习
一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...
随机推荐
- BZOJ 1486: [HNOI2009]最小圈 [01分数规划]
裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...
- js短路表达式
今天碰见个题目,感觉短路表达式很好用. 题目: 定义一个计算圆面积的函数area_of_circle(),它有两个参数: r: 表示圆的半径: pi: 表示π的值,如果不传,则默认3.14 funct ...
- java环境搭建 windows
windows搭建Java环境 1.下载java开发工具jdk安装包 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...
- javamail+ical4j发送会议提醒
本篇讲述小编在使用ical4j时对其的理解与使用,留作笔记的同时希望能帮助到大家! 初学者可以先了解下ical4j的基本信息: iCalender编程基础,了解与使用ical4j:https://ww ...
- Atom Mac安装 有快捷方式
https://jeffjade.com/2016/03/03/2016-03-02-how-to-use-atom/ 如何在 PyCharm 中使用 MacDown 作为外部编辑器 新编码神器Ato ...
- IDEA的优质使用博客资源
intelliJ idea 使用技巧&方法 IntelliJ IDEA 常用设置讲解 IntelliJ IDEA 详细图解最常用的配置 ,适合刚刚用的新人. IntelliJ IDEA 常见文 ...
- GitLab的安装及使用教程
1.配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo 复制以下内容: [gitlab-ce] name=gitlab-ce baseurl=http://mirro ...
- filezilla server客户端FTP连接不上解决
windows服务器上安装Filezilla server后,本地客户端连接不上.解决办法: 1.在防火墙把filezilla的 Filazilla server interface.exe 和Fil ...
- 奥酷HTML5视频直播系统AMS6.0
今日,北极星通自主研发的流媒体服务系统Aoku Media Server6.0发布了,将正式支持HTML5直播,这使得网页中无需有flash播放插件或者其他插件,可直接观看直播,HTML5直播也会使得 ...
- Yaf框架的配置
http://www.laruence.com/manual/yaf.ini.html //先看一下惠新宸鸟哥yaf官网的配置说明 我们可以在php.ini中定义开发环节配置项,把本地开发设置成dev ...