DRF十大组件用法和作用


 ###################################################认证实现
    自定义认证的类
     """
     from rest_framework.authentication import BaseAuthentication
     from rest_framework.exceptions import AuthenticationFailed
     from authapp.models import UserToken
     class MyOrderAuthentication(BaseAuthentication):
            在这里实现认证的逻辑
         def authenticate(self, request):
             token = request._request.GET.get('token')
             # 获取到token之后,需要在数据库中查找token
             obj = UserToken.objects.filter(token=token).first()
             if not obj:
                 # 没有通过认证
                 raise AuthenticationFailed('认证失败')
             # 返回元组( user, auth )
             return (obj.user, obj)
     """
 
    使用局部配置(在视图函数中)
     """
     class OrderView(APIView):
         # 通过authentication_classes设置认证类
         authentication_classes = [MyOrderAuthentication,]
         # 通过authentication_classes设置为空列表,就不再进行认证了
         # authentication_classes = []
     """
 
    全局配置
     """
     REST_FRAMEWORK = {
         'DEFAULT_AUTHENTICATION_CLASSES':['unitls.authentication.MyOrderAuthentication'],
     }
     """
 
    设置匿名用户
     """
     REST_FRAMEWORK = {
         'UNAUTHENTICATED_USER': lambda :"匿名用户",
         'UNAUTHENTICATED_TOKEN': lambda :'123456',
     }
     """
 
    ## 最最重要的,理清认证的源代码
 
 
################################################################权限
 权限
 
   自定义权限类
   """
     from rest_framework.permissions import BasePermission
     class MyOrderPermission(BasePermission):
         #自定义权限认证的类,必须要实现has_permission方法
         message = '你不是超级用户,没有权限访问'
         def has_permission(self, request, view):
         
             #Return `True` if permission is granted, `False` otherwise.
             #返回True表示有权限访问,返回False表示没有权限访问
             if request.user.user_type != 3:
                 return False
             return True
   """
 
   局部使用
   """
    class OrderView(APIView):
    
         # permission_classes设置权限类
         permission_classes = [MyOrderPermission,]
         # 通过authentication_classes设置为空列表,就不再进行权限认证了
         permission_classes = []
   """
 
   全局的设定
   """
    REST_FRAMEWORK = {
       'DEFAULT_PERMISSION_CLASSES':['unitls.permission.MyOrderPermission'],
    }
   """
   
   最最重要的,理清权限认证的源代码
 
 
##############################################################节流
节流:
   自定义节流类
   """
    VISIT_RECORD = {}
    class VisitThrottle(object):
        def __init__(self):
            self.history = None
        def allow_request(self,request,view):
            #实现节流的逻辑
            #基于ip做节流
            # #获取用户访问的IP地址
            # ip_address = request._request.META.get('REMOTE_ADDR')
            ctime = time.time()
            # if ip_address not in VISIT_RECORD:
            #     #第一次访问的时候将访问的时间存储在字典中(ip地址为Key,访问的时间为value值)
            #     VISIT_RECORD[ip_address] = [ctime,]
            #
            # #第二次访问的时候取出访问的历史记录
            # history = VISIT_RECORD[ip_address]
            # 基于用户的节流
            username = request.user.username
            if username not in VISIT_RECORD:
                VISIT_RECORD[username] = [ctime, ]
            history = VISIT_RECORD[username]
            self.history = history
            while history and history[-1] < ctime - 10:
                #如果访问的时间记录超过60秒,就把超过60秒的时间记录移除
                history.pop()
            if len(history) < 6:
                history.insert(0,ctime)
                return True
            return False
        def wait(self):
            #一旦用户访问次数到达阀值,显示用户需要等待的时间
            ctime = time.time()
                        #09:54:30    09:54:28
            return 10 - (ctime - self.history[-1])
   """
 
   局部使用
   """
       class OrderView(APIView):
           # throttle_classes设置节流类
           throttle_classes = [VisitThrottle,]
   """
           
   全局设置
   """
    REST_FRAMEWORK = {
       'DEFAULT_THROTTLE_CLASSES':['unitls.throttle.VisitThrottle'],
    }
   """
   
   使用DRF内置的限频类
    """
    from rest_framework.throttling import SimpleRateThrottle
    
    #推荐使用这种
    class VisitThrottle(SimpleRateThrottle):
        #没有登录用户,每分钟访问10次
        scope = 'logined'
        def get_cache_key(self, request, view):
        return request.user.username
    "&#
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值