目录
1 概念
中间件是处理请求与响应的插件,很像flask中的异常处理与请求钩子 11.异常处理与请求钩子_Suyuoa的博客-CSDN博客
django中中间件以类的形式展现,类必须继承 django.utils.deprecation.MiddlewareMixin
中间件必须实现下列五个方法中的一个或多个



- process_template_response的render方法指的并不是模板的那个render方法,而是视图函数的响应中有render的属性,我们在下面使用的时候会提到
中间件中大多数放我可以通过返回None表示忽略当前操作进入下一项事件,当返回响应对象时表示此请求结束,直接返回给客户端
- 大概意思就是如果没出什么问题你返None就行了,如果出了问题你也别让用户直接看到问题,给用户一个写好的响应结果
2 配置
在setting.py中的MIDDLEWARE处已经有一些默认的中间件

默认的中间件意思分别是
- django.middleware.security.SecurityMiddleware 请求与响应的安全改进
- django.contrib.sessions.middleware.SessionMiddleware 如果没有这个就不能使用session
- django.middleware.common.CommonMiddleware 通用中间件,功能可以看一下这个 内置中间件CommonMiddleware_长大的小蚂蚁的博客-CSDN博客
- django.middleware.csrf.CsrfViewMiddleware csrf(跨站请求伪造)保护,跨站请求伪造大致意思是你登录了A网站后没有推出,然后你登录了B网站(同一个浏览器打开两个标签页),然后B网站获取到了A网站的信息,并伪装成你给A网站发请求。想了解csrf可以看一下这个 CSRF简介_manster1231的博客-CSDN博客_csrf
- django.contrib.auth.middleware.AuthenticationMiddleware 有了这个可以使用request.user来表示当前登录的用户
- django.contrib.messages.middleware.MessageMiddleware 消息框架中间件,使用这个中间件上面的session中间件必须开启,且session中间件要在message中间件的上方
- django.middleware.clickjacking.XFrameOptionsMiddleware 点击劫持保护
3 自定义中间件
3.1 创建
一般我们会在项目目录下创建一个名为middleware的Python Package来放置自定义中间件

先创建一个文件夹名为middleware再创建一个__init__.py也是一样的

之后我们在middleware中再新建一个py文件,我命名为test,在test中我们先简单写一下

- process_response与process_template_response方法一定要返回一个response对象,不然请求就没有响应了,会报错
- 如果process_template_response没触发那你不给也不会报错
3.2 注册
之后我们到settings.py中注册该中间件

依次是 文件夹名 文件名 类名
之后再搞一个路由

搞一个视图

3.3 使用情况
我们先访问test_middleware

- 使用了render属性就会以你定义方法中的返回值返回,之前的返回值就没用了
看一下终端的情况,第一个是我们test_middleware的请求,第二个是favicon(网页上的图标)我们可以忽略

先看一下执行顺序,首先是中间件的process_request,然后是中间件的process_view,之后执行视图函数,之后是中间件的process_template_response,之后执行render的方法,最后执行中间件的process_response
正常来说是不会走发生异常的(访问为定义的路由也不会触发process_exception),我们如果要出发异常必须配合python的关键字raise



4 中间件的执行顺序
我们现在再搞一个中间件测试一下,在print()的内容最后都加一个1,方便区分

之后进行注册

之后再访问有raise的那个路由

发现中间件的执行顺序在进视图之前按注册顺序正着来,进视图之后按注册顺序反着来
5 中间件csrf防范的使用方式
django的csrf防范方式为在页面中存一个值,然后在cookie中存一个值,在请求的时候如果这两个值匹配则判定为正常请求,如果不匹配则判定为非法请求。
首先我们打开csrf中间件

之后我们再搞一个路由和视图



只有POST提交表单的时候会使用到csrf,使用GET请求没有影响

但使用POST就有影响了,我们直接点击提交会返回403

我们需要在模板层的form中加入{% csrf_token %} 来完成csrf验证

这样再点击提交就没问题了

在cookie中可以看到csrftoken

在网页源代码中可以看到一个名为csrfmiddlewaretoken的input,这个input是隐藏的,这里的input的值与cookie值是配套的

现在我想让该视图不进行csrf校验,我们可以使用csrf_exempt装饰器

这样取消掉模板中的 {% csrf_token %}

也是可以成功提交的

6 应用
6.1 限制请求次数
我们现在限制每个用户每十秒只能访问/test开头的地址5次,使用request.META['REMOTE_ADDR']可以得到远程客户端的IP地址,使用request.path_info可以得到客户端访问的请求路由信息

之后去settings.py中进行注册

我们访问一下路由test_csrf,前5次都可以正常访问

第六次会出现提示

等待十秒后再次访问

发现可以正常访问