zoukankan      html  css  js  c++  java
  • 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')
    csrf打开全局使用,个别需要免除

    总结:

            总结:
                - 本质,基于反射来实现
                - 流程:路由,view,dispatch(反射)
                - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)
                    
                扩展:
                    - csrf 
                        - 基于中间件的process_view方法
                        - 装饰器给单独函数进行设置(认证或无需认证)
                        

     

     
     
     
  • 相关阅读:
    Percona 工具包 pt-online-schema-change 简介
    MySQL 中NULL和空值的区别
    MySQL二进制日志文件过期天数设置说明
    MySQL大小写敏感说明
    SpringBoot 配置Druid:不显示SQL监控 —(*) property for user to setup
    IDEA 启用/禁用 Run Dashboard
    java.lang.IllegalAccessException: Class XX can not access a member of class XXX with modifiers "private static"
    Swagger2常用注解说明
    更改IDEA默认使用JDK1.5编译项目
    Spring Boot : Swagger 2
  • 原文地址:https://www.cnblogs.com/yimiflh/p/9281181.html
Copyright © 2011-2022 走看看