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'
    }
}
posted @ 2019-04-03 20:35  robertzhou  阅读(418)  评论(0编辑  收藏  举报