Django的中间件

Django 中间件是 Django 中的门户

Django 支持程序员 自定义中间件 并且暴露给程序员五个可以自定义的方法

  1. 请求来的时候 需要经过中间件 才能真正到达 Django 后端
  2. 相应走的时候也需要经过默认的七个中间件才能发送出去
研究djangol中间件代码规律
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',

from django.contrib.sessions.middleware import SessionMiddleware

  • 必须掌握
    process_request
    process_response
  • 了解即可
    process_view

路由匹配成功之后执行视图函数之前 会自动执行中间件里面的该方法
顺序是按照配置文件中注册的中间件从上往下的顺序依次执行

process_tmplate_response

返回的是 HttpResponse 对象中有 render 属性才会触发
顺序是按照配置文件注册的中间件 从上往下
process_exception
当视图函数中出现异常的情况下 出发
顺序如上

如何自定义中间件

1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
然后在这个类里面就可以自定义五个方法了
(这五个方法并不是全部都需要书写,用几个写几个)
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
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',
·你自己写的中间件的路径1',
'你自己写的中间件的路径2',
'你自己写的中间件的路径3引',

必掌握

  • process_requset
  1. 请求俩的时候需要经过每一个中间件里面的 process_request 方法
    结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
  2. 如果中间件中没有定义改方法 那么直接跳过执行下一个中间件
  3. 如果改方法返回了 HttpResponse 对象 那么请求将不再继续往后执行 而是直接原路返回(检验失败不允许访问)
    process_response 方法就是用来做全局相关的所有限制功能
  • process_response
  1. 相应走的时候 需要经过每一额中间件中的 process_response 方法有两个额外的参数 request,response response 是后端想要传给前段的数据
  2. 该方法必须要返回一个 HttpResponse 对象
    1. 默认返回的是行参 response
    2. 你也可以直接返回自己的内容 不过这同样会导致 原本的页面被替换
  3. 顺序是按照配置文件中注册了的中间件从下往上依次经过如果没有定义的情况直接跳过执行下一个

process_request

from django.utils.deprecation import MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self,request):
    print('我是第一个自定义中间件里面的process_request方法')
class MyMiddleware2(MiddlewareMixin):
def process_request(self,request):
    print('我是第二个自定义中间件里面的process_request方法')

process_response

def process_response(self,request,response):
    print('我是第一个自定义中间件里面的oro cess_-response;方法')
    return HttpResponse("hello world!")

问题探讨

研究如果在第一个process_request方法就已经返回了HttpResponse对象
那么响应走的时候是经过所有的中间件里面的process_response 还是有其他情况
是其他情况 就是会直接走同级别的process_reponse返回


flask框架也有一个中间件但是它的规律
只要返回了一个对象了就必须经过所有中间件里面的类似于process_reponse方法
研究如果在第一个 process_request 还是有其它情况

posted @   yiermu  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示