• drf 频率组件 META字典详情


    drf频率组件

    什么是频率
    控制用户对某个url的请求频率,比如一分钟之内,只能访问三次
    

    自定义频率规则

    1.取出访问者ip
    2.判断当前ip在不在访问字典中:
        不在,则添加进去,返回True;
    3.循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个事件大于60s,(判断最早登陆的是不是超过60s)把这种数据pop掉,这样列表中只有60s以内的访问时间
    4.判断,当前列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表的第一个位置(最早时间是否超过60s),返回True,顺利通过
    5.当大于等于3,说明一分钟访问超过三次,返回False验证失败
    

    Http request请求 META(获得用户IP)

    7.HttpRequest.META
    一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
    取值:
    
    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE —— 请求的正文的MIME 类型。
    HTTP_ACCEPT —— 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
    HTTP_HOST —— 客服端发送的HTTP Host 头部。
    HTTP_REFERER —— Referring 页面。
    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR —— 客户端的IP 地址。
    REMOTE_HOST —— 客户端的主机名。
    REMOTE_USER —— 服务器认证后的用户。
    REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
    SERVER_NAME —— 服务器的主机名。
    SERVER_PORT —— 服务器的端口(是一个字符串)。
    从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
    
    

    自定义频率控制器

    import time
    class Mythorttle():
        request_dic = {}
        def __init__(self):
            self.history = None
        def allow_request(self, request, view):
            ip = request.META.get('REMOTE_ADDR')
            if not ip:return False
            ctime = time.time()
            if ip not in self.request_dic:
                self.request_dic[ip] = [ctime,]
                return True
            self.history = self.request_dic[ip]
            while self.history and ctime - self.history[-1]>60:
                self.history.pop()
            if len(self.history)>=3:
                return False
            self.history.insert(0,ctime)
            return True
    
        def wait(self):
            return 60 - (time.time()-self.history[-1])
    

    drf的内置频率控制器

    写一个类,继承自SimpleRateThrottle,(根据ip限制)问:要根据用户现在怎么写
    
    from rest_framework.throttling import SimpleRateThrottle
    class VisitThrottle(SimpleRateThrottle):
        scope = 'num'
        def get_cache_key(self, request, view):
            return self.get_ident(request)
        
        
    在setting里配置:(一分钟访问五次) 
    
    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_RATES':{
            'num':'5/m'
        }
    }
    
    在视图类里使用
    class Users(ModelViewSet):
        # authentication_classes = [Auth, ]
        throttle_classes = [VisitThrottle,]
        serializer_class = UserSerializer
        queryset = UserInfo.objects.all()
    

    错误信息中文显示

    class Course(APIView):
        authentication_classes = [TokenAuth, ]
        permission_classes = [UserPermission, ]
        throttle_classes = [MyThrottles,]
        
        def throttled(self, request, wait):
            from rest_framework.exceptions import Throttled
            class MyThrottled(Throttled):
                default_detail = '傻逼啊'
                extra_detail_singular = '还剩 {wait} second.'
                extra_detail_plural = '还剩 {wait} seconds.'
            raise MyThrottled(wait)
    

    内置频率类及全局使用

    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',],
        'DEFAULT_THROTTLE_RATES':{
            'luffy':'3/m'
        }
    }
    
  • 相关阅读:
    sql server 阻塞与锁
    JVM监控
    Java性能分析之线程栈详解与性能分析
    MySQL监控调优
    JVM(上)
    性能测试流程介绍
    性能测试分析调优思路
    监控分析——Web中间件
    Linux性能测试工具安装全集
    Java基础(二十)集合(2)Collection接口
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10651342.html
Copyright © 2020-2023  润新知