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初始的详细博客内容:请点击我 该应用包 ...
随机推荐
- Python之Suds库调用WCF时复杂参数序列化
今天主要做自动化测技术支持工作,最近一直在做接口自动化这块,前些天在研究将web页面模拟http进行接口自动化,这周杭州那边想测试WCF服务,所以这两天一直在探索.遇到的第一个问题就是服务参数传参序列 ...
- BZOJ 1116: [POI2008]CLO [连通分量]
Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度 ...
- 微信小程序页面跳转的问题(app.json中设置tarBar后wx.redirectTo和wx.navigateTo均不能实现跳转到指定的页面)
1.设置的tabBar代码片段: "tabBar": { "list": [ { "pagePath": "pages/homep ...
- redis新手入门,摸不着头脑可以看看<三>——lrange分页
看了几天 redis开发与运维,写了个小demo练练手,直接上代码. 1.首先是数据库,本地要有redis,具体的如何安装redis,官网下个就好了,sososo. 2.启动redis 注意启动命令. ...
- [Python Study Notes]正则表达式
正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 P ...
- 图论算法-Tarjan模板 【缩点;割顶;双连通分量】
图论算法-Tarjan模板 [缩点:割顶:双连通分量] 为小伙伴们总结的Tarjan三大算法 Tarjan缩点(求强连通分量) int n; int low[100010],dfn[100010]; ...
- Apollo阿波罗配置中心docker
前言 在分布式系统中,要改个配置涉及到很多个系统,一个一个改效率低下,吃力不讨好.用配置中心可以解决这个问题.当然配置中心有不少,以下对比的表格是照搬Apollo Wiki的. 功能点 Apollo ...
- 使用Git的hook实现代码的自动部署
这个功能非常的好用,可以省去诸多麻烦!我自己也是摸索了好久,才完全掌握的.希望能对大家有所帮助! 1,首先在我的阿里云服务器上已经创建好了一个代码远程的管理仓库,/srv/cmp.git 2, 在服务 ...
- php的内置函数debug_backtrace()与get_included_files()跟踪代码调用(Thinkphp框架举例)
debug_backtrace() 在我们开发一个项目中,或者二开研究某个开源程序,需要对代码流程一步步去跟踪,来研究它的逻辑,才可以进行修改,达到我们的开发目的.php的内置函数debug_back ...
- filter-api文档
git地址:https://github.com/jiqianqin/filters 不断优化中,欢迎加入讨论- filter-tags 效果图: 参数 说明 格式 备注 data 展示的数据 [{ ...