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

最新文章

  1. grails项目获取前后台的值
  2. 函数lock_rec_create
  3. WinForm 实现登录,验证成功,关闭登录界面,显示主界面
  4. ajax.abort 终止AJAX请求
  5. form表单上传文件使用multipart请求处理
  6. 如何使用 tf object detection
  7. Bootstrap方法之--排版、代码
  8. python经典书籍推荐:Python核心编程
  9. Flask的Windows部署:mod_wsgi + Apache
  10. Linux:文件系统层次结构标准(Filesystem Hierarchy Standard)
  11. dbms_redefinition在线重定义表结构
  12. 微信小程序 - 表单验证插件WxValidate使用
  13. Hive的安装和使用
  14. pycurl post
  15. Tornado + Celery + RabbitMQ
  16. Python学习-35.Python中的List Comprehensions(列表解释|列表生成式)
  17. grunt入门讲解3:实例讲解使用 Gruntfile 配置任务
  18. UITableView的UITableViewStyleGrouped
  19. 在 Symfony Command中自定义脚本把Excel数据导入到数据库中
  20. Python实现CSV数据的读取--两种方法实现

热门文章

  1. 一个基于Net Core3.0的WPF框架Hello World实例
  2. 通过Value获取Map中的键值Key的四种方法
  3. Appium的加载过程
  4. CSPS模拟 43
  5. ASP.NET Core 3.0 gRPC 拦截器
  6. 一、EditPlus 的安装 - Java软件的安装
  7. 「动态规划」-数位dp专题
  8. Elastic Stack 开源的大数据解决方案
  9. 从 DevOps 到 Serverless:通过“不用做”的方式解决“如何更高效做”的问题
  10. 力扣(LeetCode)买卖股票的最佳时机 个人题解