一.django的中间件
1.一个python类 用于全局范围内 处理请求 和响应的 勾子 谨慎使用
2. 自定义 middleware.py 中可以写多个类---->多个中间件 在setting中注册 开启
3.执行顺序: 浏览器-->wsgi(封装request,response对象) process_request ---> process_view--> view---> process_response
---->wsgi--->浏览器
1.process_request(request) 根据注册顺序执行
如果 一个类的process_request 有返回httpresponse 对象 注册顺序在这个类之前的还会执行process_request,process_response
在这个类之后注册 的 request 和response 中间件和view 都不会执行了 (注册循序在下面的)
2.process_response(request,response) 根据注册顺序 反序 执行
必须返回一个response 对象
3.process_view(view_func view_args view_kwargs) 根据注册顺序执行
在process_request, 匹配路由 之后, 在view之前执行 返回值None就正常走
返回resposne时 它之后的 process_view view 不执行 执行所有process_resposne
4.process_exception(request,exception) 根据注册顺序 反序 执行
有异常时执行 在view之后,在process_response之
返回值: 如果 是httpresponse 将执行 在他注册顺序 之后 的中间件的 process_response 函数(与process_request一样)
不执行在它之后的 process_exception不执行
5. process_template_response()
在resposne 有render方法时 执行 不是函数的render 返回值: resposne对象
ret=HttpResposne('ok') ret.render=xx xx是一个返回response的函数
6.总结
1.在view左边的都是注册顺序执行,在view 右侧的 都是 注册反序执行
当process_request 返回 response时,执行他自己的process_resposne, 当process_view返回resposne时执行所有resposne
process_exception 触发条件,贯穿整个右侧 执行process_exception 之后的process_resposne中间件
7.整个流程图
requet.META.get('REMOTE_ADDR') 获得访问ip地址
二. csrf_token 工作流程
1. CSRF中间件
CSRF跨站请求伪造 当html网页中 放上 {%csrf_token%} 时 浏览器 的cookie就会添加一个这样的cookie
2. csrf_token校验方式
1. process_request 中的 cookie中:
从请求的cookie中获取csrftoken的值 ——》csrf_token ——》request.META['CSRF_COOKIE']
2.process_views 中:
request.META.get('CSRF_COOKIE') —— 》 csrf_token
request_csrf_token = ""
3.csrf_token获取方式
1. 从request.POST中获取csrfmiddlewaretoken对应的值
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
2. 从请求头中获取X-csrftoken 的值
request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')
request_csrf_token 和 csrf_token 做对比
如果校验成功 正常走
如果校验不成功 拒绝