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的中间件的更多相关文章

  1. 自定义Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  2. python/ Django之中间件

    python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...

  3. Django组件-中间件

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

  4. 细说Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  5. csrf 跨站请求伪造相关以及django的中间件

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成. 1.django中常用的中间件? - proces ...

  6. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  7. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  8. day 52 Django 的中间件加载顺序

    前情提要: django的中间键的作用是进行加载 可以通过中间键进行辅助操作 1.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局 ...

  9. django框架--中间件系统

    目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...

  10. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

随机推荐

  1. Java入门系列之包装类(四)

    前言 上一节我们讲解了StringBuilder VS StringBuffer以及二者区别,本节我们来讲解包装类. 包装类 我们知道在Java中有8中基本数据类型,分为数值类型:byte.short ...

  2. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  3. java 超详细面经整理(持续更新)2019.12.18

    目录 Java SE 请你谈谈Java中是如何支持正则表达式操作的? 请你简单描述一下正则表达式及其用途. 请你比较一下Java和JavaSciprt? 在Java中如何跳出当前的多重嵌套循环? 讲讲 ...

  4. Customize the Application UI and Behavior 自定义应用程序UI和行为

    In XAF, the business model defines the database structure and UI appearance. Changes to your persist ...

  5. C#关于反序列化实例时,接收实体字段少于或大于原实体对象 解析测试

    在项目中总会用到son解析,比如RabbitMQ中使用json串解析,比如发过来的实体对象有50个字段,而实际只需要用到里面的几个字段,这时我们创建实体时,只需要创建需要的几个字段即可. 测试实例,首 ...

  6. 解决npm下载慢的问题

    方法一:使用淘宝定制的cnpm命令行工具替代默认安装npm npm install -g cnpm --registry=https://registry.npm.taobao.org 方法二:将np ...

  7. [iOS开发]关于cocoapods的使用

    CocoaPods的使用 关于CocoaPods,相信做iOS开发的应该都比较熟悉了.Cocoapods是一个用来管理第三方库的比较好用的管理工具.关于Cocoapods的东西不再多说,接下来进入正题 ...

  8. 【React Native】进阶指南之二(手势响应系统)

    移动设备上的手势识别要比在 web 上复杂得多.用户的一次触摸操作的真实意图是什么,App 要经过好几个阶段才能判断.比如 App 需要判断用户的触摸到底是在滚动页面,还是滑动一个 widget,或者 ...

  9. Notification 弹出一个通知在桌面右下角

    if (!("Notification" in window)) { //alert("This browser does not support desktop not ...

  10. 通过官网模板轻松实现Grafana的可视化界面配置(以MySQL监控项为例)

    我们知道可视化是监控的一个重要环节,所以往往我们这个环节花费大量的时间和精力.可是如果可以借鉴前辈的经验和成果,可以事半功倍.Grafana 有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编 ...