_潜行者

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考文章:https://blog.csdn.net/u013380694/article/details/90019571

1.可用于类方法(post,put)中的数据验证,相当于Schema

def validate_serializer(serializer):
    """
    @validate_serializer(TestSerializer)
    def post(self, request):
        return self.success(request.data)
    """
    def validate(view_method):
        @functools.wraps(view_method)
        def handle(*args, **kwargs):
            self = args[0]
            request = args[1]
            s = serializer(data=request.data)
            if s.is_valid():
                request.data = s.data
                request.serializer = s
                return view_method(*args, **kwargs)
            else:
                return self.invalid_serializer(s)

        return handle

    return validate

2.可用于类方法权限等的认证

class BasePermissionDecorator(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, obj, obj_type):
   #给call方法动态添加被装饰类对象作为参数
return functools.partial(self.__call__, obj) def error(self, data): return JSONResponse.response({"error": "permission-denied", "data": data}) def __call__(self, *args, **kwargs): self.request = args[1] if self.check_permission(): if self.request.user.is_disabled: return self.error("Your account is disabled") return self.func(*args, **kwargs) else: return self.error("Please login first") def check_permission(self): raise NotImplementedError() class login_required(BasePermissionDecorator): def check_permission(self): return self.request.user.is_authenticated() class super_admin_required(BasePermissionDecorator): def check_permission(self): user = self.request.user return user.is_authenticated() and user.is_super_admin() class admin_role_required(BasePermissionDecorator): def check_permission(self): user = self.request.user return user.is_authenticated() and user.is_admin_role() class problem_permission_required(admin_role_required): def check_permission(self): if not super(problem_permission_required, self).check_permission(): return False if self.request.user.problem_permission == ProblemPermission.NONE: return False return True

使用:

class ContestPasswordVerifyAPI(APIView):
    @validate_serializer(ContestPasswordVerifySerializer)
    @login_required
    def post(self, request):
        pass

 

posted on 2018-11-22 20:02  _潜行者  阅读(216)  评论(0)    收藏  举报