zoukankan      html  css  js  c++  java
  • AI-DRF权限、频率

    权限

    权限逻辑

    权限逻辑
    
    权限组件可以设置在三个地方:
    写在每个类下边表示,访问这个类的数据时,没有权限就不能访问;
    写在全局,表示访问每个字段的数据都需要权限;还有默认已经也写好了。 写在每个类中:写一个权限组件,套入到需要加权限的类中,组件中写业务逻辑。
    业务逻辑:首先提前在user用户中加入字段user_type,
    写好type
    =((1,"VIP"),(2,"SVIP"),(3,"SSVIP")),user_type=models.IntegerField(choices=type),
    当user_type>=2时,表示可以访问资源,按照源码流程,直接返回True即可,反之亦然。
    #url.py
    url(r'^course/', views.Courseview.as_view()),
    #views.py
    class SSVIPPermission(object):
        def get_permissions(self,request,view):  #源码中抠的函数,view可有可无,一般不用
            if request.user.user_type>=2:
                return True  #源码中,如果权限user_type大于等于2,相当于是svip、ssvip,表示可以访问资源;
                                              
    return False #返回False表示无权限 class Courseview(APIView): permission_classes=[SSVIPPermission] #将权限组件加入course这个资源类。 def get(self,request): # 使用序列化传数据 course_list=Course.objects.all() cs=CourseSerializer(course_list,many=True) #如果有多个字段,不可能使用course.desc这种方式,
                                                     需要序列化简便!
    print(cs.data) return Response(cs.data) #我的序列化接口 def post(self,request): print(request.data) cs=CourseSerializer(data=request.data) if cs.is_valid(): #校验 Course.objects.create(**request.data) return Response(cs.data) #序列化数据 else: return Response(cs.errors) # 序列化错误信息

    权限源码

        def check_permissions(self, request):
            for permission in self.get_permissions():
                if not permission.has_permission(request, self):
                    self.permission_denied(
                        request, message=getattr(permission, 'message', None)
                    )
    
    解析:当调用get_permissions()时,若get_permissions()被返回了True,permission为True,接下来的代码就不走了,
    可以直接访问数据了,若返回False,代表要走if
    not...语句,返回message错误提醒。 另外message可以自己写,一般是英文,可以写出中文加到SSVIPPermission类下。

    频率

    访问频率逻辑
    
    流程基本上是:当用户访问数据时,要获取ip地址,和当前访问时间戳,存放到字典里。当第一次访问时,将访问的ip地址创建到字典里,
    接着做判断,当第一次访问时间和最后一次访问时间间隔大于60s,那么就无权限访问了,然后将访问间隔大于60的用户ip地址删除掉,
    继续访问即可!

    首先定义个VISIT_RECORD字典用来存放ip地址、当前访问的时间戳。

    #一分钟一个IP只能访问3次的配置
    from rest_framework.throttling import BaseThrottle
    VISIT_RECORD={}
    class VisitThrottle(BaseThrottle):
    
        def __init__(self):
            self.histroy = None
    
        def allow_request(self, request, view):
    
            remote_addr=request.META.get("REMOTE_ADDR")
            print(remote_addr)  #取到访问用户的ip地址
            import time
            ctime=time.time()
            print(ctime)  #当前时间戳
    
            if remote_addr not in VISIT_RECORD:
                VISIT_RECORD[remote_addr]=[ctime,]  #将第一次访问,字典里没有IP地址,则创建当前ip地址。
                                                    # 再将{"127.0.0.1":1544185712.4733276}
                                  放到VISIT_RECORD字典
    return True history=VISIT_RECORD.get(remote_addr) self.histroy=history while history and history[-1]<ctime-60: #当当前的用户访问时间大于60了,删除这个ip记录 history.pop() if len(history)<3: history.insert(0,ctime) #如果一分钟内访问了3次以下,插入记录,返回True,继续访问 return True else: #如果一分钟内访问了3次以上,返回False return False def wait(self): import time ctime=time.time() return 60-(ctime-self.histroy[-1])
    class Courseview(APIView):
    
        throttle_classes = [VisitThrottle]  #频率组件
        def get(self,request):
    
    
    
            course_list=Course.objects.all()
            cs=CourseSerializer(course_list,many=True)  #如果有多个字段,不可能使用course.desc这种方式,
                                    需要序列化简便!
    print(cs.data) return Response(cs.data) #我的序列化接口 def post(self,request): print(request.data) cs=CourseSerializer(data=request.data) if cs.is_valid(): #校验 Course.objects.create(**request.data) return Response(cs.data) #序列化数据 else: return Response(cs.errors) # 序列化错误信息

    使用频率组件

    #url.py
    url(r'^course/', views.Courseview.as_view()),
    #settings.py
    '
    DEFAULT_THROTTLE_CLASSES':("app01.views.VisitThrottle",), 'DEFAULT_THROTTLE_RATES':{ "visit_rate":"6/m", #visit_rate可以随便起名,在views中设置 }
    #访问频率的配置-使用组件
    from rest_framework.throttling import SimpleRateThrottle
    class VisitThrottle(SimpleRateThrottle):  #访问频率封装在SimpleRateThrottle方法里
        scope="visit_rate"  #可以设置字段
    
        def get_cache_key(self, request, view):
            return self.get_ident(request)  #拿到ip地址
  • 相关阅读:
    编程之美:位运算应用集萃
    【总结系列】互联网服务端技术体系:高性能之缓存面面观
    【总结系列】互联网服务端技术体系:高性能之并发(Java)
    【总结系列】互联网服务端技术体系:高性能之数据库索引
    【总结系列】互联网服务端技术体系:可扩展之数据分区
    一道关于二叉树的字节面试题的思考
    python基础之range()函数和random模块
    记录下第一次参加leetcode 周赛
    几种方法实现“反转字符串”
    c# 自动更新程序
  • 原文地址:https://www.cnblogs.com/djfboai/p/10084663.html
Copyright © 2011-2022 走看看