经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django使用中间键实现csrf认证详解
来源:jb51  时间:2019/7/22 11:24:46  对本文有异议

Django中的csrf认证实现的原理

调用 process_view 方法

检查视图是否被 @csrf_exempt (免除csrf认证)

- 去请求体或cookie中获取token

情况一(全站使用csrf认证,局部不想使用csrf认证)

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

如果我想让某个请求不通过csrf认证可以这样做

  1. from django.views.decorators.csrf import csrf_exempt
  2. @csrf_exempt # 该函数无需认证
  3. def users(request):
  4. user_list = ['alex','oldboy']
  5. return HttpResponse(json.dumps((user_list)))

情况二(全站不使用csrf认证,局部想使用csrf认证)

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. #'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

如果我想让某个请求使用csrf认证可以这样做

  1. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  2. @csrf_protect # 该函数需认证
  3. def users(request):
  4. user_list = ['alex','oldboy']
  5. return HttpResponse(json.dumps((user_list)))

CBV小知识,csrf时需要使用

- @method_decorator(csrf_exempt)

- 在dispatch方法中(单独方法无效)

方式一

  1. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  2. from django.utils.decorators import method_decorator
  3. class StudentsView(View):
  4. @method_decorator(csrf_exempt)
  5. def dispatch(self, request, *args, **kwargs):
  6. return super(StudentsView,self).dispatch(request, *args, **kwargs)
  7.  
  8. def get(self,request,*args,**kwargs):
  9. print('get方法')
  10. return HttpResponse('GET')
  11.  
  12. def post(self, request, *args, **kwargs):
  13. return HttpResponse('POST')
  14.  
  15. def put(self, request, *args, **kwargs):
  16. return HttpResponse('PUT')
  17.  
  18. def delete(self, request, *args, **kwargs):
  19. return HttpResponse('DELETE')

方式二

  1. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  2. from django.utils.decorators import method_decorator
  3.  
  4. @method_decorator(csrf_exempt,name='dispatch')
  5. class StudentsView(View):
  6.  
  7. def get(self,request,*args,**kwargs):
  8. print('get方法')
  9. return HttpResponse('GET')
  10.  
  11. def post(self, request, *args, **kwargs):
  12. return HttpResponse('POST')
  13.  
  14. def put(self, request, *args, **kwargs):
  15. return HttpResponse('PUT')
  16.  
  17. def delete(self, request, *args, **kwargs):
  18. return HttpResponse('DELETE')

总结:

  • - 本质,基于反射来实现
  • - 流程:路由,view,dispatch(反射)
  • - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)

扩展:

  • - csrf
    • - 基于中间件的process_view方法
    • - 装饰器给单独函数进行设置(认证或无需认证)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号