【15.0】Django框架之中间件引入
【一】Django中间件介绍
【1】什么是Django中间件
-
Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。
-
它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。
-
中间件是按照顺序依次执行的,每个中间件都可以对请求和响应进行修改、补充或处理。
-
在Django的settings.py配置文件中,通过MIDDLEWARE设置来定义中间件的顺序。
【2】作用:
-
认证和授权:
- 中间件可以在请求到达视图之前进行用户认证和权限验证,确保只有经过授权的用户才能访问敏感资源。
-
请求和响应处理:
-
中间件可以在请求到达视图之前对请求进行预处理
- 例如添加请求头信息、检查请求参数的合法性等操作。
-
同时,在视图函数返回响应给客户端之前,中间件还可以对响应进行后处理
- 例如添加额外的响应头、包装响应数据等操作。
-
-
异常处理:
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
- 例如记录异常日志、返回自定义错误信息等。
- 中间件还可以捕获视图函数中可能抛出的异常,并做相应的处理
-
性能优化:
- 通过中间件,可以对请求进行性能监测、缓存处理、压缩响应等操作,提升网站的整体性能。
【3】示例
【二】Django请求生命周期流程图
- 当客户端发送一个请求到Django应用程序时,Django会按照一定的生命周期流程处理该请求。
- 下面是Django请求的典型生命周期流程图:
- 客户端发出HTTP请求。
- 请求被Web服务器接收并传递给Django应用程序。
- Django中的WSGI中间件开始处理请求,并可进行一些预处理操作。
- 中间件将请求传递给URL分发器(URL Dispatcher)。
- URL分发器根据URL模式将请求路由到相应的视图函数或处理器(View/Handler)。
- 视图函数或处理器执行相应的业务逻辑,可能会与数据库等外部资源交互。
- 视图函数或处理器返回一个HTTP响应对象。
- 响应对象经过中间件,可以在此进行后处理操作。
- 响应被发送给Web服务器。
- Web服务器将响应发送回客户端。
【三】Django中间件是Django的门户
- 请求发来的时候需要先经过中间件才能到达真正的Django后端
- 响应返回的时候,最后也需要进过中间件返回发送出去
【四】Django中间件源码分析
【1】默认的五个中间件详解
(1)SecurityMiddleware
django.middleware.security.SecurityMiddleware
:- 安全中间件负责处理与网站安全相关的任务
- 例如设置HTTP头部,防止跨站脚本攻击(XSS),点击劫持等。
- 它可以通过配置自定义安全策略来确保网站的安全性。
(2)SessionMiddleware
django.contrib.sessions.middleware.SessionMiddleware
:- 会话中间件负责处理用户会话的创建之间存储和检索用户数据。
- 它基于浏览器提供的Cookie或URL传递的会话ID进行会话跟踪,并将会话数据存储在后端数据库或缓存中,以实现用户状态的跨请求保持。
(3)CommonMiddleware
django.middleware.common.CommonMiddleware
:- 通用中间件提供了一些常见而关键的HTTP请求处理功能
- 例如,根据请求的HTTP头信息设置语言、时区等。
- 此外,它还处理静态文件的serving,包括收集静态文件,为其生成URL,并在开发模式下提供静态文件的serving。
(4)CsrfViewMiddleware
django.middleware.csrf.CsrfViewMiddleware
:- CSRF(Cross-Site Request Forgery)中间件用于防止跨站请求伪造攻击。
- 它在每个POST请求中验证一个CSRF标记,确保请求是通过合法的表单提交得到的,从而保护用户免受恶意站点的攻击。
(5)AuthenticationMiddleware
django.contrib.auth.middleware.AuthenticationMiddleware
:- 认证中间件负责处理用户身份认证相关的任务
- 例如将认证信息关联到请求对象上,为每个请求提供一个user对象,以便在请求处理过程中轻松地获取和使用用户身份信息。
(6)MessageMiddleware
django.contrib.messages.middleware.MessageMiddleware
:- 消息中间件用于在请求处理过程中存储和传递临时的、一次性的用户消息。
- 它允许在HTTP重定向之间跨请求传递消息,例如成功或错误提示,以改善用户体验。
(7)XFrameOptionsMiddleware
django.middleware.clickjacking.XFrameOptionsMiddleware
:- 点击劫持中间件用于防止页面被嵌入到其他网站中,从而提供一定的点击劫持保护。
- 它通过设置X-Frame-Options HTTP头部来限制页面的显示方式,从而防止恶意网页通过iframe等方式嵌入当前网页。
【2】源码剖析
(1)源码
SessionMiddleware
源码
CsrfViewMiddleware
源码
(2)精简
CsrfViewMiddleware
精简
SessionMiddleware
源码精简
【五】中间件方法
- Django支持程序员自定义中间件
- 并且暴漏给程序员五个中间件
【1】必须掌握的中间件方法
(1)process_request:
(1)执行顺序
- 请求来的时候需要经过每一个中间件的 process_request 方法
- 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
(2)没有定义process_request
- 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
- 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
(4)总结
- process_request 方法就是用来 做全局相关的所有限制功能
- 该方法在每个请求到达视图之前被调用,可以对请求进行预处理。
- 例如,进行身份验证、访问控制或请求日志记录等操作。
- 它接收一个HttpRequest对象作为参数,并且没有返回值。
示例:
(2)process_response:
响应被返回的时候需要结束每一个中间件里面的 process_response 方法
- 该方法有两个额外的参数
- request
- response
该方法必须返回 HttpResponse 对象
- 默认是response
- 支持自定义
顺序是按照配置文件中注册过的中间件从下往上依次经过
- 如果没有定义,则跳过,校验下一个
- 该方法在每个请求结束并且响应返回到客户端之前被调用。
- 可以在此处对响应进行处理
- 例如添加额外的头信息、修改响应内容等。
- 它接收一个HttpRequest对象和HttpResponse对象作为参数,并且必须返回一个HttpResponse对象。
示例:
【2】需要了解的中间件方法:
(1)process_view:
- 路由匹配成功后执行视图函数之前
- 会自动执行中间件里面的该方法
- 顺序是按照配置文件中注册的中间件从上而下的顺序执行
- 该方法在请求到达视图之前被调用,在视图函数执行前执行。
- 可以在此处进行一些操作
- 如修改请求参数或进行记录等。
- 它接收一个HttpRequest对象和一个视图函数作为参数,并且可以返回一个HttpResponse对象或None。
示例:
(2)process_template_response:
- 返回的 HttpResponse 对象有 render 属性的时候才会触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
- 该方法在视图函数返回一个TemplateResponse对象时调用。
- 可以在此处修改模板响应
- 例如添加全局的上下文数据或进行额外的渲染操作。
- 它接收一个HttpRequest对象和一个TemplateResponse对象作为参数,并且必须返回一个TemplateResponse对象。
示例:
(3)process_exception:
- 当视图函数中出现异常的情况下触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
- 该方法在视图函数抛出异常时被调用。
- 可以在此处捕获异常并进行处理
- 例如返回一个定制的错误页面或进行日志记录等。
- 它接收一个HttpRequest对象和一个异常对象作为参数,可以返回一个HttpResponse对象来替代原始的异常响应。
示例:
【六】自定义中间件
【1】process_request
【1】路由层
【2】视图层
【3】配置文件
【4】自定义中间件
【5】总结
(1)执行顺序
- 请求来的时候需要经过每一个中间件的 process_request 方法
- 结果的顺序是按照配置文件中注册的中间件从上往下的顺序执行的
(2)没有定义process_request
- 如果没有定义这个方法,就跳过这个中间件
(3)定义了返回值
- 如果在自定义中间件中定义了返回值(三板斧),那么请求将不再继续执行,而是直接原路返回(校验失败不允许访问)
(4)总结
- process_request 方法就是用来 做全局相关的所有限制功能
【2】process_response`
-
响应被返回的时候需要结束每一个中间件里面的 process_response 方法
- 该方法有两个额外的参数
- request
- response
- 该方法有两个额外的参数
-
该方法必须返回 HttpResponse 对象
- 默认是response
- 支持自定义
-
顺序是按照配置文件中注册过的中间件从下往上依次经过
- 如果没有定义,则跳过,校验下一个
【3】小结
-
如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?
- 会直接走同级别的 process_response 方法 ,然后直接返回
-
flask框架的中间件也有一个类似的方法
- 但是flask返回数据就必须经过所有中间件里面的 process_response 方法
__EOF__

本文作者:Chimengmeng
本文链接:https://www.cnblogs.com/dream-ze/p/17563243.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/dream-ze/p/17563243.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17563243.html