Fork me on GitHub

Django中间件

django 的 中间件

process_request              最早执行
process_view                 执行视图前
process_template_response    视图函数返回 render的时候
process_exception            异常执行
process_response             最后执行

应用场景:
    基于角色的权限控制
    用户认证
    csrf --- prcocess-view方法
    cors 跨域
    session 
    黑白名单
    日志管理

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 基于CBV 实现登录控制的方式

基于FBV -- login_reqeuired 装饰器


基于CBV

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

    (1)  继承基类

    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() # 类的实例化
posted @ 2018-02-28 10:33  派对动物  阅读(204)  评论(0编辑  收藏  举报
Top