• $Django Rest Framework-频率组件,解析器


    1 频率组件

    #自定义组件写频率认证(重点继承BaseThrottle)
    from rest_framework.throttling import BaseThrottle
    import time
    class Thro(BaseThrottle):
        dic={}
        def allow_request(self, request, view):
            '''
            :param request:
            :param view:
            :return: 布尔类型
            '''
            ctime=time.time()
            self.ip=request.META.get('REMOTE_ADDR')
            if self.ip and self.ip not in self.dic:
                self.dic[self.ip]=[ctime]
                return True
            lis=self.dic.get(self.ip)
            #把最早的时间和现在时间对比 1.大于多少秒(60s)的去掉 2.留下的是多少秒内(60秒内)的时间数 = 访问次数
            while lis and ctime-lis[-1]>60:
                lis.pop()
            #剩下的时间列表 1.在多少秒内(60s内)2.设置访问次数:列表内时间个数=限制范文次数
            if len(lis)<6:
                lis[:0]=[ctime]
                print (self.dic)
                return True
            print(self.dic)
            return False
        #访问超过限制触发
        def wait(self):
            '''
            :return:多少秒过后才可以访问
            '''
            #最早的时间
            tim=self.dic.get(self.ip)[-1]
            ctime=time.time()
            #ctime-tim 值越来越大
            return 60-(ctime-tim)
    
    
    #局部使用
    throttle_classes=[Thro,]
    #全局使用
    REST_FRAMEWORK = {
           'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ],
       }
    自定义的频率组件
    #settings
    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ],
        'DEFAULT_THROTTLE_RATES': {
            #self.scope : self.rate
            'keykey': '6/m'  #1分钟最大访问次数为6
        }
    
    }
    
    #定义一个频率组件类(重点继承SimpleRateThrottle)
    class Thro(SimpleRateThrottle):
        scope = 'keykey'
        def get_cache_key(self, request, view):
            # 返回ip地址
            # ip=request.META.get('REMOTE_ADDR')
            # return ip
            return self.get_ident (request)
    内置的频率组件(只需配置一下,再写个类返回ip/可以返回用户名_按需求)
    class Books(APIView):
        #apiview的方法
        # def throttled(self, request, wait):
        #     """
        #     If request is throttled, determine what kind of exception to raise.
        #     """
                #源码:实例话了一个对象,我们只需要把这个  数据属性的英文错误改成中文
                #中文显示:让后再让我们自定义类的对象调父类的ini方法
        #     raise exceptions.Throttled (wait)
        #改中文
        def throttled(self, request, wait):
            from rest_framework import exceptions
            class sss(exceptions.Throttled):
                default_detail = '访问限制'
                extra_detail_singular = '{wait}秒解除限制'
                extra_detail_plural = 'Expected available in {wait} seconds.'
            raise sss(wait)
        def get(self,request):
            response={'status':100,'msg':'请求成功'}
            books=models.Book.objects.all()
            ser=Myserializers.Books(books,many=True)
            response['data']=ser.data
            return JsonResponse(response,safe=False)
    限制访问改中文信息

    2 解析器

        作用:传过来的数据,解析成字典
            使用:
            局部使用:
                from rest_framework.parsers import JSONParser,FormParser
                在视图类中:
                parser_classes = [FormParser,]
            全局使用
                REST_FRAMEWORK = {
                    'DEFAULT_PARSER_CLASSES':[
                        'rest_framework.parsers.JSONParser'
                    ]
    
                }
    
                局部使用指定的解析器:
                在视图类中:
                parser_classes = [FormParser,]
    内置的直接使用
  • 相关阅读:
    Spring Boot 自定义 Banner 教程
    Spring Boot 操作 Excel
    Spring Boot 文件上传简易教程
    SpringMVC 处理请求的整个流程?入口?
    实现单例模式的9个方法
    Mybatis Generator最完整配置详解
    接口限流
    添加jar包到本地Maven仓库
    Java ConcurrentModificationException异常原因和解决方法
    RESTful API 设计指南[转]
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/10121394.html
Copyright © 2020-2023  润新知