目录
中间件是处理请求与响应的插件,很像flask中的异常处理与请求钩子 11.异常处理与请求钩子_Suyuoa的博客-CSDN博客
django中中间件以类的形式展现,类必须继承 django.utils.deprecation.MiddlewareMixin
中间件必须实现下列五个方法中的一个或多个
中间件中大多数放我可以通过返回None表示忽略当前操作进入下一项事件,当返回响应对象时表示此请求结束,直接返回给客户端
在setting.py中的MIDDLEWARE处已经有一些默认的中间件
默认的中间件意思分别是
一般我们会在项目目录下创建一个名为middleware的Python Package来放置自定义中间件
先创建一个文件夹名为middleware再创建一个__init__.py也是一样的
之后我们在middleware中再新建一个py文件,我命名为test,在test中我们先简单写一下
之后我们到settings.py中注册该中间件
依次是 文件夹名 文件名 类名
之后再搞一个路由
搞一个视图
我们先访问test_middleware
看一下终端的情况,第一个是我们test_middleware的请求,第二个是favicon(网页上的图标)我们可以忽略
先看一下执行顺序,首先是中间件的process_request,然后是中间件的process_view,之后执行视图函数,之后是中间件的process_template_response,之后执行render的方法,最后执行中间件的process_response
正常来说是不会走发生异常的(访问为定义的路由也不会触发process_exception),我们如果要出发异常可以配合python的关键字raise
我们现在再搞一个中间件测试一下,在print()的内容最后都加一个1,方便区分
之后进行注册
之后再访问有raise的那个路由
发现中间件的执行顺序在进视图之前按注册顺序正着来,进视图之后按注册顺序反着来
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 %}
也是可以成功提交的
我们现在限制每个用户每十秒只能访问/test开头的地址5次,使用request.META['REMOTE_ADDR']可以得到远程客户端的IP地址,使用request.path_info可以得到客户端访问的请求路由信息
之后去settings.py中进行注册
我们访问一下路由test_csrf,前5次都可以正常访问
第六次会出现提示
等待十秒后再次访问
发现可以正常访问