1、中间件的定义
举例(实际上中间件不仅仅只在这三个地方触发):
2、编写中间件
对于新手来说,重点就是前三个,即:process_request, process_view和process_response
大多数情况下,如果中间件返回的是None,则说明request是OK的,可以进入下一个环节了,而如果返回HttpResponse对象,则说明request是有问题的
3、注册中间件
实操:
4、中间件执行总流程(非常重要,web端面试高频题,必须会)
面试官问:你讲述一下,请求进到Django直到响应出来都经历了哪些环节?
答:经历了中间件的process_request方法,URL(路由),中间件的process_view方法,以及Django的MTV结构。此外,如果请求在进入Django的过程中抛出了异常,则会返回HttpResponse,而所有的HttpResponse都会进入到process_response做最后一道处理,生成最终的响应,返回给浏览器。
详细描述:
浏览器发送一个请求,进入到Django的process_request中间件(按照注册顺序,由上至下逐一调用每一个中间件的process_request方法),此时,有两条路:一条是return None,继续往后走进入到URL,另一条是return HttpResponse,那请求到这里就终止了,直接进入到process_response环节。如果是return None进入到URL路由,从路由出来后就进入到process_view中间件环节,同样是按照注册顺序,由上至下逐一调用每个中间件的process_view方法。这里也是分两条路,一个是return None继续向下走,另一个是return HttpResponse结束。如果是return None,则进入到Django的MTV结构里。如果在视图里面抛出Exception(异常),被process_exception中间件抓到了(注意,在请求进入视图之后,是按照注册顺序反向调用每个中间件的process_exception),则return HttpResponse
5、CSRF攻击(跨站伪造请求攻击)
1)CSRF定义
2)CSRF防范
如上图所示,进行CSRF攻击的网站只能从用户浏览器的cookie中获取到暗号2,却没有暗号1,所以攻击不会成功。
3)CSRF配置步骤
实操:
views.py中:
urls.py中:
settings.py中:
解决方法:在html文件的form标签下写{% csrf_token %}