Django(十、中间件)

本文详细介绍了Django中的中间件概念,包括其作用、功能、自定义方法及顺序,还重点讲解了CSRF跨站请求伪造问题,提供了form表单验证和装饰器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、中间件的介绍

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

中间件流程图
在这里插入图片描述

中间件有什么用

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图)

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',
]

这七个中间件程序会在请求来时自上而下依次的处理request请求,在响应走时自下而上依次处理response响应。

中间件功能

网站访问频率的校验 用户权限的校验等全局类型的功能需求

前期我们要访问post请求,中间件的第四个字符串妨碍了简单post请求,初期阶段我们将其注释掉了

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.七个中间件都继承了MiddlewareMixin类
2.都几乎有process_request和process_response函数
3.都必须传入参数
process_request需要传入request参数;
process_response需要传入request和response两个参数,必须返回response。

自定义中间

如何自定义中间件
1.创建存储自定义中间件代码的py文件或者目录(如果中间件很多)
2.参考自带中间件的代码编写类并继承
3.在类中编写五个可以自定义的方法
4.一定在配置文件中注册中间件才可以生效
在这里插入图片描述
编写自定义的中间件(在mymiddlie中编写MyMiddleware001)
在这里插入图片描述
编写好中间件,一定要去settings里的Middleware中注册自定义的中间件
在这里插入图片描述

中间件的顺序

我们只是定义了process_reqtest和process_response函数,我们想看看执行的顺序的,我们可以做一个小测试

mymiddle.py(自定义的中间件)

from django.utils.deprecation import MiddlewareMixin

class MyMiddleware001(MiddlewareMixin):
    def process_request(self,request):
        print('from MyMiddleware001 process_request')

    def process_response(self,request,response):
        print('from MyMiddleware001 process_response')
        return response

class MyMiddleware002(MiddlewareMixin):
    def process_request(self,request):
        print('from MyMiddleware002 process_request')

    def process_response(self,request,response):
        print('from MyMiddleware002 process_response')
        return response

当我们从网页向URL发送请求时,请求通过了网关接口到达了中间件,在中间件的执行过程是自上而下,从而经过路由层>>视图层>>>等,当响应是经过中间件的时候是自下而上的,返回给网关接口,再打包给浏览器,

在这里插入图片描述
打印结果
在这里插入图片描述
如果我们还想测试如果遇到HttpResponse对象,会怎么样?看下面的解释

django中间件两个基本方法
process_request
1.请求来的时候会从上往下依次经过每一个注册的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回

如果请求遇到了process_request方法,该方法返回了HttpResponse对象,如下

class MyMiddleware001(MiddlewareMixin)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值