zoukankan      html  css  js  c++  java
  • DRF框架之 用户角色权限与访问频率的权限设置

    1. 简单演示,创建一个models的数据库表

    class User(models.Model):
        name=models.CharField(max_length=32)
        pwd=models.CharField(max_length=32)
        choice=((1,'超级用户'),(2,'普通用户'),(3,'穷逼用户'))
        type=models.IntegerField(choices=choice,null=True)
        # typ=models.ForeignKey(to='Type')
    
    # class Type(models.Model):
    #     id=models.AutoField(primary_key=True)
    #     name=models.CharField()
    
    class UserToken(models.Model):
        token = models.CharField(max_length=64)
        user=models.OneToOneField(to='User')

    2. 编写一个角色权限的方法

    #权限类
    from rest_framework.permissions import BasePermission
    class MyPermissions(BasePermission):
        # message='你是2b'
        def has_permission(self,request,view):
            #代表是超级用户
            if request.user.type ==1:
                #如何去除type对应的文字  get_字段名_display()
                user_str=request.user.get_type_display()
                print(user_str)
    
                #超级用户,校验通过,返回true,校验失败,返回false
                return True
            else:
    
                return False

    3. 演示调用方法

    from rest_framework.request import Request
    from rest_framework.authentication import SessionAuthentication
    # from app01.MyAuth import MyAuthetication
    from app01.MyAuth import MyPermissions
    from app01.MyAuth import MyThrottling
    class BooksView(APIView):
        # authentication_classes=[MyAuthetication]
        # permission_classes=[MyPermissions]
        permission_classes=[]
        throttle_classes=[MyThrottling]
        def get(self,request):
            #request.user就是当前登录用户
            print(request.user)
            print(request.auth)
            return Response('ok')

    4. 如何全局使用呢?

    # 认证的全局配置
    REST_FRAMEWORK={
        'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',],
        'DEFAULT_PERMISSION_CLASSES':['app01.MyAuth.MyPermissions',],
    
    }

    5.如何局部使用呢?

    from app01.MyAuth import MyPermissions
    
    class BooksView(APIView):
    
        permission_classes=[MyPermissions]
    
        def get(self,request):
            #request.user就是当前登录用户
            print(request.user)
            print(request.auth)
            return Response('ok')

    # 这样就是简单的局部使用了


    drj框架之 访问频率类设置

        频率
            频率是什么?
                同一时间段内,只能访问多少次
                
            
            频率的使用:
                -写一个类:
                from rest_framework.throttling import SimpleRateThrottle
                class MyThrottling(SimpleRateThrottle):
                    scope='xxx'
                    #必须重写get_cache_key,返回什么,频率组件会以什么做限制(比如返回ip,它就以ip做限制,如果返回user_id,它会以用户id做限制)
                    def get_cache_key(self, request, view):
                        
                        return request.META.get('REMOTE_ADDR')
    什么是频率,如何做设置
    #drf给我们提供的频率控制类
    from rest_framework.throttling import SimpleRateThrottle
    class MyThrottling(SimpleRateThrottle):
        scope='luffy'
        def get_cache_key(self, request, view):
            self.get_ident(request)
            return request.META.get('REMOTE_ADDR')

    #注意: 这里的scope='luffy' 是按照项目名字来的,
    # 认证的全局配置
    REST_FRAMEWORK={
        'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',],
        'DEFAULT_PERMISSION_CLASSES':['app01.MyAuth.MyPermissions',],
        # 'DEFAULT_THROTTLE_CLASSES':['app01.MyAuth.MyThrottling'],
        'DEFAULT_THROTTLE_RATES': {
            'luffy': '10/day'
        }
    
    #注意 在做全局生效的时候 'luffy' : 必须和之前写的策略的scope = 'luffy' 要对应起来
    #注意 '10/day' 这里可以自己定义, 一天访问10次,如果想要 一分钟访问6次 就是 '6/m'
    }
    from app01.MyAuth import MyPermissions
    from app01.MyAuth import MyThrottling
    class BooksView(APIView):
    
        throttle_classes=[MyThrottling]

    #局部使用

    #注意: 在编写程序的时候访问频率还是很重要的,这样东西只要复制简单修改下就可以使用了!!!!

    补充:
        1 如果token信息放到请求头中,如何取?
            # request._request.META
            token=request.META.get('token')
        2 django的GET,POST,META,body分别对应HTTP请求的哪部分?
            -GET---->http请求路径中数据部分
            -POST--->http请求以urlencode/formdata形式编码的body体部分
            -META--->http请求头部信息
            -body--->http请求请求体部分
            -path,get_full_path(),FILES
  • 相关阅读:
    爱上你的一百个理由 (网摘)
    梦想向右,沉默向左
    明夕何夕,君已陌路。
    不肯嫁的几种男人(转)
    一剪梅
    C# preprocessor Directives
    Language
    C# Language Tour
    Web application
    Unsafe code
  • 原文地址:https://www.cnblogs.com/gukai/p/10780722.html
Copyright © 2011-2022 走看看