Django 中间件
在Django中就是一个类,在全局范围内改变Django的输入和输出。
- 五个方法
-
process_request(self,request)
-
process_view(self, request, view_func, view_args, view_kwargs)
-
process_template_response(self,request,response)
-
process_exception(self, request, exception)
-
process_response(self, request, response)
参数 执行的时间 执行的顺序 返回值process_request(self,request)
执行时间:在视图函数执行之前 参数:request ——》 跟视图函数中的是同一个 执行顺序:按照注册顺序 顺序执行 返回值:None: 正常流程 HttpResponse对象:不执行后面中间中的process_request方法,不执行视图函数,直接执行当前中间件中的process_response方法,后面正常走
process_response(self, request, response)
执行时间:在视图函数执行之后 参数:request ——》 跟视图函数中的是同一个 response ——》 视图函数中传递的响应对象 执行顺序:按照注册顺序 倒叙执行 返回值:HttpResponse对象:必须是响应对象
process_view(self, request, view_func, view_args, view_kwargs)
执行时间:在process_request方法之后,在视图函数执行之前 参数:request ——》 跟视图函数中的是同一个 view_func ——》 视图函数 view_args —— 》视图函数的位置参数 view_kwargs——》视图函数的关键字参数 执行顺序:按照注册顺序 顺序执行 返回值:None: 正常流程 HttpResponse对象:不执行后面中间中的process_view方法,不执行视图函数,直接执行最后一个中间件中的process_response方法,后面正常走
process_exception(self, request, exception)
执行时间:出现异常的时候才执行 参数:request ——》 跟视图函数中的是同一个 exception——》 异常对象 执行顺序:按照注册顺序 倒叙执行 返回值:None: 正常流程 HttpResponse对象:不执行后面中间中的process_exception方法,直接执行最后一个中间件中的process_response方法,后面正常走
process_template_response(self,request,response)
执行时间:视图函数返回的response对象有一个叫render的方法 参数:request ——》 跟视图函数中的是同一个 response ——》 视图函数中传递的响应对象 执行顺序:按照注册顺序 倒叙执行 返回值:必须返回response对象
csrf中间件
csrf 跨站请求伪造
补充两个装饰器:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf_exempt 给视图加上装饰器后,当前的视图不需要CSRF校验
csrf_protect 给视图加上装饰器后,当前的视图需要CSRF校验
-
process_request:
从cookie中获取csrftoken的值 —— 》 request.META['CSRF_COOKIE'] -
process_view
-
视图函数加上csrf_exempt装饰器,不进行CSRF校验
-
请求方式 是'GET', 'HEAD', 'OPTIONS', 'TRACE' 也不进行校验
-
csrf_token = request.META.get('CSRF_COOKIE') # cookie中获取csrftoken的值
获取提交的csrfmiddlewaretoken的值
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
如果或许不到csrfmiddlewaretoken的值
再尝试从请求头中获取X_CSRFTOKEN的值 —— 》request_csrf_token -
request_csrf_token 和 csrf_token 进行比较
- 能比较成功 通过校验
- 不能比较成功 拒绝
-
定义中间件
- 在APP 下创建 middleware 的文件夹
- 写一个 py 文件
- 定义一个类 继承middlewareMixin 类
from django.utils.deprecation import MiddlewareMixin - 注册中间件
app名.middleware.***.py.类名