django8-django的中间件
1.django的客户请求流程
之前登录功能 ,需要获取用户的sesssion ,但是每个视图函数都要加装饰器来校验很不合理 ,中间件就可以解决这个问题
用户客户端--->wsgi(封装了request对象)--->中间件(框架hook)--->路由--->views--->models--->db--->template---中间件--->wsgi--->客户端
2.什么是中间件
django中间件用来处理django的请求和响应框架级别的钩子 ,在全局范围内改变django的输入和输出 ,有多种类型中间件, 每个中间件都可以完成特定功能 ,可以帮助我们在执行视图函数前后完成额外操作 ,本质是类
settings中MIDDLEWARE配置的就是中间件信息 ,字符串也是一个个类 ,也就是一个个中间件 ,可以通过import点击查看类
3.自定义中间件
5种中间件 ,关注点在于 参数! 执行的时机! 执行顺序! 返回值!
本质就是类 ,类中定义下前面的五种方法 ,在不同时机执行产生不同作用!
process_request(self,request)
process_view(self,request,view_func,view_args,view_kwargs)
process_template_response(self,request,response)
process_exception(self,request,exception)
process_response(self,request,response)
1)process_request(self,request)
参数: wsgi返回的request对象
执行时间: 在收到request后执行之前 (截断不满足要求的请求)
执行顺序: 按照setting注册顺序执行 ,在注册的类中按顺序拿出每个类中这个方法执行
返回值:
当返回值为空None: url-->views
当返回response对象: 直接返回客户端
##middle/middles.py 一个类就是一个中间件 ,可以写多个
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse class MD1(MiddlewareMixin):
def process_request(self, request):
print('MD1 process_request')
# return HttpResponse('拒绝访问') #如果return那么就会直接返回客户端 ##settings.py注册
MIDDLEWARE = [
...
'middle.middles.MD1',
...
]
2)process_response(self,request,response)
参数: wsgi返回的request对象 ,response对象(可能是视图函数返回的 ,也可能是process_request返回的)
执行时机: 在视图函数执行之后 ,还可能是是process_request有返回值之后按顺序执行
执行顺序: 按照setting注册顺序倒序执行 ,在注册的类中倒叙获取每个类中的process_response方法执行
返回值: 必须返回response对象
##/middle/middles.py 写两个中间件查看执行顺序
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse class MD1(MiddlewareMixin):
def process_request(self, request):
print('MD1 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD1 process_response')
# return HttpResponse('拒绝访问')
return response class MD2(MiddlewareMixin):
def process_request(self, request):
print('MD2 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD2 process_response')
# return HttpResponse('拒绝访问')
return response ##settings 注册两个中间件类
MIDDLEWARE = [
...
'middle.middles.MD1',
'middle.middles.MD2',
...
]
3)process_view(self,request,view_func ,view_args, view_kwargs)
参数: wsgi给的request对象 ,view_func匹配本次执行视图函数 ,view_args匹配本次视图函数位置参数 ,view_kwargs匹配本次视图函数关键字参数
执行时机: 在url匹配到视图函数后执行 ,再执行视图函数
执行顺序: 按照setting注册顺序执行
返回值:
返回值为空: 正常流程(process_request--->url--->process_view--->views.py--->process_response)
response对象: 截断流程(process_request--->url--->process_view(直接跳过所有view方法,和所有视图函数直接返回response)-->process_response)
##middle/middles.py 有返回值的view ,观察执行结果
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse class MD1(MiddlewareMixin):
def process_request(self, request):
print('MD1 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD1 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD1 process_view', view_func)
return HttpResponse('test') class MD2(MiddlewareMixin):
def process_request(self, request):
print('MD2 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD2 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD2 process_view', view_func) ###执行结果
MD1 process_request
MD2 process_request
MD1 process_view <function presslist at 0x0408BF60> #MD1有return ,MD2的view就不执行了直接跳到response
MD2 process_response
MD1 process_response
4)process_exception(self ,request, exception)
参数: wsgi返回的request对象 ,exception视图函数的异常
执行时机: 在执行视图函数 ,有异常的情况
执行顺序: 按setting的注册倒序执行
返回值:
返回值为空: 交给下一个process_exception处理
返回response对象: 跳过其他process_exception ,开始process_response的倒叙顺序执行 (如果所有的exception都没处理这个异常 ,那么最后会由django做异常处理)
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse class MD1(MiddlewareMixin):
def process_request(self, request):
print('MD1 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD1 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD1 process_view', view_func) def process_exception(self, request, exception):
print('MD1 process_exception')
print(exception)
return HttpResponse(exception) class MD2(MiddlewareMixin):
def process_request(self, request):
print('MD2 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD2 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD2 process_view') def process_exception(self, request, exception):
print('MD2 process_exception')
print(exception) ###视图函数中加入一条错误 ,让process_exception捕获 ,
MD1 process_request
MD2 process_request
MD1 process_view <function presslist at 0x03BAC078>
MD2 process_view
MD2 process_exception
invalid literal for int() with base 10: 'ok'
MD1 process_exception
invalid literal for int() with base 10: 'ok'
MD2 process_response
MD1 process_response
5)process_template_response(self,request,response)
参数: wsgi返回的request对象
执行时机: 视图函数执行返回Templateresponse对象才会执行
执行顺序: 根据setting注册顺序倒序执行 ,如果设置了多个该类型中间件结果会是最后一个
返回值: response对象(Templateresponse对象)
Templateresponse对象: 这个对象使用与render相似 ,但是render最终返回的也是Httpresponse对象 ! 目前两个对象区别就在于templateresponse可以在中间件进行修改
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse class MD1(MiddlewareMixin):
def process_request(self, request):
print('MD1 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD1 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD1 process_view', view_func) def process_exception(self, request, exception):
print('MD1 process_exception')
print(exception)
return HttpResponse(exception) def process_template_response(self, request, response):
response.context_data = {'author': 'ggg'}
print('MD1 process_template_response')
return response ##middle/middles.py 指定templateresponse返回的数据
class MD2(MiddlewareMixin):
def process_request(self, request):
print('MD2 process_request')
# return HttpResponse('拒绝访问') def process_response(self, request, response):
print('MD2 process_response')
# return HttpResponse('拒绝访问')
return response def process_view(self, request, view_func, view_args, view_kwargs):
print('MD2 process_view') def process_exception(self, request, exception):
print('MD2 process_exception')
print(exception) def process_template_response(self, request, response):
response.context_data = {'author': ''}
print('MD2 process_template_response')
return response ##视图函数返回编程templateresponse对象
from django.template.response import TemplateResponse def presslist(request):
msg_all = models.presslist.objects.all()
return TemplateResponse(request, 'cbs.html', {'msg': msg_all, 'author': 'qgw'})
5.session使用中间件优化
将校验的session的过程放到process_request中
1.如果客户端没有cookie存储的sessionid则跳转到login函数
2.如果用户访问login函数那么就不需要cookie
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, HttpResponse, reverse, redirect, HttpResponseRedirect class MD1(MiddlewareMixin):
"""缺陷是如果login函数能跳过中间件就好了"""
def process_request(self, request):
if not request.session.get('auth') and request.path_info != reverse('tlogin'):
nowurl = request.path_info
url = reverse('tlogin') + '?next={}'.format(nowurl)
if nowurl == reverse('tlogin'):
url = reverse('tlogin')
return redirect(url)
解析csrf安全的中间件
django8-django的中间件的更多相关文章
- 自定义Django的中间件
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...
- python/ Django之中间件
python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...
- Django组件-中间件
1.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...
- 细说Django的中间件
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...
- csrf 跨站请求伪造相关以及django的中间件
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成. 1.django中常用的中间件? - proces ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- django 自定义中间件 middleware
Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...
- day 52 Django 的中间件加载顺序
前情提要: django的中间键的作用是进行加载 可以通过中间键进行辅助操作 1.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局 ...
- django框架--中间件系统
目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
随机推荐
- Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)
一.前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数.我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理.其 ...
- Python 从入门到进阶之路(四)
之前的文章我们简单介绍了一下 Python 的几种变量类型,本篇文章我们来看一下 Python 中的函数. 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性, ...
- 【TencentOS tiny】深度源码分析(5)——信号量
信号量 信号量(sem)在操作系统中是一种实现系统中任务与任务.任务与中断间同步或者临界资源互斥保护的机制.在多任务系统中,各任务之间常需要同步或互斥,信号量就可以为用户提供这方面的支持. 抽象来说, ...
- SAP 表汇总
SAP 表整理:VBKPF-预制凭证抬头表: VBKPF-预制凭证抬头表 VBKPF-预制凭证抬头表 VBSEG-预制凭证行项目表: VBSEG-预制凭证行项目表 VBSEG-预制凭证行项目表 VBS ...
- [javascript string] slice();substr();substring();之间的区别
今天遇到这个问题,发现ぜんぜんわすねまます3个方法,直接上代码吧,[网络版本较多就不注明参考过哪些了 -0- ] var test = 'hello world'; //均一位参数测试 console ...
- 一种简单的REST API接口加密实现,只允许自己的产品调用后台,防止接口被刷
在项目上线后,后台接口很容易通过抓包工具看到, 难免被人为构造恶意请求攻击我们的系统,相信大家都或多或少都遇到过短信验证码被刷.疯狂留言灌水.数据被恶意爬取等问题,这种直接抓接口然后写个循环调用的行为 ...
- OC-AVAudioPlayer的使用小记
- (void)viewDidLoad { [super viewDidLoad]; //设置音乐的后台播放,注意background mode中需要勾选上 AVAudioSession *sessi ...
- Shell—文件内容操作
读取文件的每一行内容并输出 #!/bin/bash # 方法1 while read line do echo $line done < a.txt # 方法2 cat a.txt | whil ...
- MyBatis中特殊符号的转义
在MyBatis中遇到特殊符号时有两种转义方式: 第一种 描述 空格 小于 大于 小于等于 大于等于 与 单引号 双引号 原符号 < > <= >= & ' " ...
- 使用STS4新建springboot项目
1.配置maven,自定义setting文件和仓库,一定要用阿里云镜像地址下载依赖,官方太坑了,整了半天都没弄好,原来是下载太慢文件损坏 <mirror> <id>alimav ...