Django在FBV与CBV模式下如何实现登录控制和csrf控制


Django在FBV与CBV模式下如何实现登录控制和csrf控制


Django 实现 csrf验证的方式

去请求体 或者 cookie中获取 token 验证

  • (1) csrf_token 中间件 – 全局配置 基于中间件的process_view函数中实现

  • (2) 视图函数中 – 通过装饰器 局部实现 (在视图中是否被 csrf_exempt,csrf_protect装饰器 装饰)


FBV模式下的 csrf 验证与免验证

函数 装饰器

  from django.views.decorators.csrf import csrf_exempt
  @csrf_exempt

  from django.views.decorators.csrf import csrf_protect
  @csrf_protect


CBV模式下的 csrf 验证与免验证 method_decorators—需要装饰dispatch函数

方式一 写在基类中,继承

	from django.utils.decorators import method_decorator
	
	class MyBaseView(object):
	    @method_decorator(csrf_exempt|csrf_protect)
	    def dispatch(self, request, *args, **kwargs):
	        print('before')
	        ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
	        print('after')
	        return ret
	
	class LoginView(MyBaseView,APIView):
	
	    def get(self,request,*args,**kwargs):
	
	        ret = {
	            'code':1000,
	            'data':'ddd'
	        }
	        response = JsonResponse(ret)
	        return response

方式二 指定 name = ‘dispatch’ 属性

	@method_decorator(csrf_protect,name='dispatch')
	class LoginView(MyBaseView,APIView):
	
	    def get(self,request,*args,**kwargs):
	
	        ret = {
	            'code':1000,
	            'data':'ddd'
	        }
	        response = JsonResponse(ret)
	        return response

方式三 直接在视图中 重写 dispatch ,加装饰器

	class LoginView(MyBaseView,APIView):
	    
	    @method_decorator(csrf_protect)
	    def dispatch(self, request, *args, **kwargs):
	        print('before')
	        ret = super(LoginView,self).disptch(request, *args, **kwargs)
	        print('after')
	        return ret
	    
	    def get(self,request,*args,**kwargs):
	
	        ret = {
	            'code':1000,
	            'data':'ddd'
	        }
	        response = JsonResponse(ret)
	        return response

Django 实现登录控制的方式

基于FBV – login_reqeuired 装饰器

from django.contrib.auth.decorators import login_required  
 
@login_required  
def my_view(request):  
    ...  


基于CBV

(1) 继承基类

        from django.contrib.auth.decorators import login_required
        from django.utils.decorators import method_decorator

        class LoginRequiredMixin(object):

            @method_decorator(login_required(login_url=reverse('login')))
            def dispatch(self,request,*args,**kwargs):
                return super(LoginRequiredMixin,self).dispatch(self,request,*args,**kwargs)

        class CourseView(LoginRequiredMixin,View):
                pass

(2) method_decorator + name = ‘dispatch’

        @method_decorator(login_required(login_url=reverse('login')),name='dispatch')
        class CourseView(View):
                    pass

(3) 直接写在视图中,重载 dispatch 函数

        class CourseView(View):
              @method_decorator(login_required(login_url=reverse('login')))
              def dispatch(self,request,*args,**kwargs):
                     return super(Course,self).dispatch(self,request,*args,**kwargs)


补充

反射的应用:

  • (1) CBV – dispatch方法中通过method获取 方法

  • (2) 中间件的导入 ‘dasdsa.aDd.xxxmiddleware’ – 导入settings

            from importlib import import_module
            module = import_module(module_path) 
            cls = getattr(module,class_name)
            cls() # 类的实例化
Buy me a 肥仔水!