CBV-3-csrf_token认证-中间件
CBV-3-csrf_token认证-中间件
csrf
views.py
1、settings.py没有注释到csrf。当post请求的方式会报错。
如果你不想有csrf_token怎么办?
中间件
面试题: 1. django中间件 最多5个 - process_request 请求 - process_view - process_response 相应 - process_exception 异常 - process_render_template 中间件执行流程: process_request 》路由匹配 找到函数不执行。》process_view 》视图函数。》process_response 2. 使用中间件做过什么? - 权限 - 用户登录验证 - django的csrf是如何实现? csrf在process_view方法 - 检查视图是否被 @csrf_exempt (免除csrf认证) - 去请求体或cookie中获取token
中间件执行流程:
1.FBV:情况一:csrf打开,个别不需要csrf认证。@csrf_exempt 全局使用csrf
代码:
情况一:打开,个别不需要csrf认证。 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 该函数无需认证 def users(request): user_list = ['alex','oldboy']
2.FBV:情况二:csrf注释,个别需要csrf认证。@csrf_protect 局部使用csrf
代码:
情况二:注释,个别需要csrf认证。 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] from django.views.decorators.csrf import csrf_protect @csrf_protect # 该函数需认证 def users(request): user_list = ['alex','oldboy'] return HttpResponse(json.dumps((user_list)))
小结:
情况一:打开,个别不需要csrf认证。 @csrf_exempt # 该函数无需认证 全局使用csrf 情况二:注释,个别需要csrf认证。 @csrf_protect # 该函数需认证 局部使用csrf
以上是FBV的csrf的使用,那CBV的csrf如何使用呢?
CBV-csrf的使用
1.CBV:情况一:csrf打开,个别不需要csrf认证。@method_decorator 全局使用csrf
运行结果:加在单独发方法上是不行的,还是会报错。
注意:加在单独发方法上是不行的,还是会报错。必须加在dispatch方法上。
方式一:加在dispatch方法上。
运行结果:
方式二:放到类上面。
代码:
CBV小知识,csrf不需要使用时:csrf打开的,全局使用,个别不需要使用。 - @method_decorator(csrf_exempt) - 必须加在dispatch方法中(单独方法无效) 方式一:定义dispatch方法 from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.utils.decorators import method_decorator class StudentsView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(StudentsView,self).dispatch(request, *args, **kwargs) def get(self,request,*args,**kwargs): print('get方法') return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def put(self, request, *args, **kwargs): return HttpResponse('PUT') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE') 方式二:加载class类上,指定方法名。装饰的位置不一样。 from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.utils.decorators import method_decorator @method_decorator(csrf_exempt,name='dispatch') class StudentsView(View): def get(self,request,*args,**kwargs): print('get方法') return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def put(self, request, *args, **kwargs): return HttpResponse('PUT') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
总结:
总结: - 本质,基于反射来实现 - 流程:路由,view,dispatch(反射) - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰) 扩展: - csrf - 基于中间件的process_view方法 - 装饰器给单独函数进行设置(认证或无需认证)