zoukankan      html  css  js  c++  java
  • rest_framework 权限流程

    权限流程

    权限流程与认证流程非常相似,只是后续操作稍有不同

    当用户访问是 首先执行dispatch函数,当执行当第二部时:

       #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制
                self.initial(request, *args, **kwargs)

    进入到initial方法:

     def initial(self, request, *args, **kwargs):
            """
            Runs anything that needs to occur prior to calling the method handler.
            """
            self.format_kwarg = self.get_format_suffix(**kwargs)
    
            # Perform content negotiation and store the accepted info on the request
            neg = self.perform_content_negotiation(request)
            request.accepted_renderer, request.accepted_media_type = neg
    
            # Determine the API version, if versioning is in use.
            #2.1处理版本信息
            version, scheme = self.determine_version(request, *args, **kwargs)
            request.version, request.versioning_scheme = version, scheme
    
            # Ensure that the incoming request is permitted
            #2.2处理认证信息
            self.perform_authentication(request)
            #2.3处理权限信息
            self.check_permissions(request)
            #2.4对用户的访问频率进行限制
            self.check_throttles(request
     #处理权限信息
            self.check_permissions(request)

    下面 开始 权限的具体分析:

    进入到check_permissions函数中

     #检查权限
        def check_permissions(self, request):
            """
            Check if the request should be permitted.
            Raises an appropriate exception if the request is not permitted.
            """
            #elf.get_permissions()得到的是一个权限对象列表
            for permission in self.get_permissions():
                #在自定义的Permission中has_permission方法是必须要有的
                #判断当前has_permission返回的是True,False,还是抛出异常
                #如果是True则表示权限通过,False执行下面代码
                if not permission.has_permission(request, self):
                    #为False的话则抛出异常,当然这个异常返回的提示信息是英文的,如果我们想让他显示我们自定义的提示信息
                    #我们重写permission_denied方法即可
                    self.permission_denied(
                        #从自定义的Permission类中获取message(权限错误提示信息),一般自定义的话都建议写上,如果没有则为默认的(英文提示)
                        request, message=getattr(permission, 'message', None)
                    )

    查看permission_denied方法(如果has_permission返回True则不执行该方法)

     def permission_denied(self, request, message=None):
            """
            If request is not permitted, determine what kind of exception to raise.
            """
            if request.authenticators and not request.successful_authenticator:
                #没有登录提示的错误信息
                raise exceptions.NotAuthenticated()
            #一般是登陆了但是没有权限提示
            raise exceptions.PermissionDenied(detail=message)

    局部权限

    permissions.py

    # 局部权限
    from rest_framework.permissions import BasePermission
    class SVIPPermissions(BasePermission):
        # 提示信息
        message = "滚!您没有权限"
        def has_permission(self,request,view):
    
            # 获取到认证的返回值
            user_obj=request.user.user
            if user_obj.user_type==3:
                return True
            else:
                return False

    view.py

    class BookViewsSet(viewsets.ModelViewSet): 
    
       # 权限
        permission_classes=[SVIPPermissions]
    
        queryset = Book.objects.all()
        serializer_class = BookModelSerializer

    全局权限

    permissions.py

    # 局部权限
    from rest_framework.permissions import BasePermission
    class SVIPPermissions(BasePermission):
        # 提示信息
        message = "滚!您没有权限"
        def has_permission(self,request,view):
    
            # 获取到认证的返回值
            user_obj=request.user.user
            if user_obj.user_type==3:
                return True
            else:
                return False

    settings.py

    REST_FRAMEWORK={
         "DEFAULT_PERMISSION_CLASSES":["api.servise.permission.SVIPPermissions"],
    }

    待续

  • 相关阅读:
    python__基础 : 类属性,类方法,静态方法
    python__基础 : 类的继承,调用父类的属性和方法
    python__基础 : 类的__init__,__str__,__del__方法
    Python__关于列表的引用 以append操作为例
    HTML5 Canvas 绘制图片不显示的问题
    MySQL 查询排除指定字段、自定义变量、动态执行SQL
    .Net系列 Transaction 事务
    Redis 基本操作
    C# 数值计算、转换
    详解.NET IL代码
  • 原文地址:https://www.cnblogs.com/caochao-/p/8809690.html
Copyright © 2011-2022 走看看