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
原文地址:https://www.cnblogs.com/gukai/p/10780722.html