Django中间件详解
Django中间件详解
中间件位置

WSGI
主要负责的就是负责和浏览器和应用之家沟通的桥梁
浏览器发送过来一个http请求,WSGI负责解包,并封装成能够给APP使用的environ,当app数据返回时,再把app的数据打包成一个http响应
想了解更详细的:https://www.cnblogs.com/zzzlw/p/9747872.html

中间件的五个方法
预处理函数
process_request(self, request)
如果返回None,Django将继续处理这个request,执行后续的中间件, 然后调用相应的 view。
如果返回HttpResponse对象,Django将不再执行任何除了process_response以外其它的中间件以及相应的view,Django将立即返回该HttpResponse。
预处理函数
process_view(self, request, view_func, view_args, view_kwargs)
如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(不论种类)以及相应的view,Django将立即返回。
模板渲染函数
process_template_response(self, request, response)
默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值(对象)中render方法的结果)
异常处理函数
process_exception(self, request, exception)
正常执行是不会执行的
(1)执行完所有 request 方法;
(2)执行所有 process_view方法;
(3)如果视图函数出错,执行process_exception方法,如果第一个中间件的process_exception方法有了返回值就不再执行其他中间件process_exception,直接执行response方法;
(4)执行所有response方法;
响应处理函数
process_response(self, request, response)
process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
具体执行的流程

内置中间件的作用
缓存中间件:
django.middleware.cache.UpdateCacheMiddleware
django.middleware.cache.FetchFromCacheMiddleware
开启全站范围的缓存。 如果开启了这些缓存,任何一个由Django提供的页面将会被缓存,缓存时长在CACHE_MIDDLEWARE_SECONDS中配置定义。
会话中间件
django.contrib.sessions.middleware.SessionMiddleware
开启会话支持,session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。
通用中间件:
django.middleware.common.CommonMiddleware
通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理成/blog/111/自动加上反斜杠。
CSRF保护中间件
django.middleware.csrf.CsrfViewMiddleware
跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。
用户授权中间件:
django.contrib.auth.middleware.AuthenticationMiddleware
他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可以在view中通过request访问user。
消息中间件
django.contrib.messages.middleware.MessageMiddleware
展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要,可以把这两个都删除。
XFrameOptionsMiddleware中间件
django.middleware.clickjacking.XFrameOptionsMiddleware
防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。
可以自己写自定义中间件测试
比如
from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse
class middleware1(MiddlewareMixin):
def process_request(self, request):
print("中间件1请求")
def process_response(self, request, response):
print("中间件1返回")
return response
def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件1view")
raise Exception("asdasd")
def process_exception(self, request, exception):
print("中间件1exception")
class middleware2(MiddlewareMixin):
def process_request(self, request):
print("中间件2请求")
def process_response(self, request, response):
print("中间件2返回")
return response
def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件2view")
def process_exception(self, request, exception):
print("中间件2exception")
class middleware3(MiddlewareMixin):
def process_request(self, request):
print("中间件3请求")
def process_response(self, request, response):
print("中间件3返回")
return response
def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件3view")
def process_exception(self, request, exception):
print("中间件3exception")
配置一下
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',
'middleWare.myzx.middleware1',
'middleWare.myzx.middleware2',
'middleWare.myzx.middleware3',
]
参考链接
wsgi
https://www.cnblogs.com/zzzlw/p/9747872.html
https://www.jianshu.com/p/46c2dc59c127
https://baijiahao.baidu.com/s?id=1622776730103957680&wfr=spider&for=pc
Django中间件详解的更多相关文章
- Django 2.0 学习(20):Django 中间件详解
Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...
- Django -- settings 详解
Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运 ...
- Django -- settings 详解(转)
Django -- settings 详解 Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目 ...
- net core 中间件详解及项目实战
net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...
- Django框架详解之url
Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...
- 中间件详解,Django复习
day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...
- Django路由详解
一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...
- Django session 详解-part II-session
Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息.session的基础还是cookie,但是它提供了一些更加高级的功能.请看下面的一个例子: 使用 ...
- 很详细的Django入门详解
Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...
随机推荐
- 利用Python迭代器查找最小值和最大值
迭代器的用法为for...in.... 迭代器如同for循环,可以遍历所有的值,但我们熟悉的的语言,都是通过下标完成的,python的循环程度要高于C语言的循环,因为python的迭代不止可以用在Li ...
- 证明:S = 1 + 1/2 + 1/4 + 1/8 + 1/16 + ·······,求证 S = 2
证: S = 1 + 1/2 + 1/4 + 1/8 + 1/16 + ······· (式1) 将式1左右两边除以2,得: S/2 = 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + ...
- Go服务监控
使用Golang可以开发出高性能的HTTP.GRPC服务.一般项目运行后,我们也需要监控服务的性能或者进行调试.除了打日志,还有没有其他可视化的方案呢?答案是有的. 本文将会介绍几种常用的监控方案. ...
- [考试反思]1105csp-s模拟测试102: 贪婪
还是有点蠢... 多测没清空T3挂40...(只得了人口普查分20) 多测题要把样例复制粘两遍自测一下防止未清空出锅. 然而不算分... 其实到现在了算不算也不重要了吧... 而且其实T3只考虑最长路 ...
- CSPS模拟 59
经ooo提醒咕题解会掉rp 我反正也冒着改不完题的风险,就开始颓博了 话说好久没这么舒坦的垫过底了233 上来一看T1,立刻就转化题意为有奇偶性和距离限制的bfs 然后就没考虑子串不能越过母串边界的事 ...
- ElasticSearch(六):索引模板
ElasticSearch(六):索引模板 学习课程链接<Elasticsearch核心技术与实战> Index Template Index Template - 帮助你设定Mappin ...
- ORACLE存储过程的创建和执行的简单示例和一些注意点
此示例的主要目的主要是为了了解在PL/SQL环境下怎么创建和执行存储过程. 存储过程所涉及的DataTable: 第一步:创建游标变量 游标是ORACLE系统在内存中开辟的一个工作区,主要用来存储SE ...
- 创建windows系统下的虚拟机
创建新的虚拟机 添加映像(windows系统下必须先添加映像) 选择相应的镜像文件:网上查找密钥输入:版本按要求选择:单击 下一步:设置虚拟机名称 位置 :下一步 默认的磁盘大小(不用管)——下一 ...
- HTML创建图像映射,布局,表单
来源: 实验楼 创建图像映射 在这之前我们动手试验过将图片作为链接来使用,触发链接的方式就是点击图片的任何地方都可以链接到跳转地址,有时我们需要实现,点击图片的不同地方跳转到不同的地方.意思就是,一张 ...
- 【algo&ds】2.线性表
1.线性表 线性表(英语:Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]-,a[n-1]组成的有限序列. 其中: 数据元素的个数n定义为表的长度 = " ...