zoukankan      html  css  js  c++  java
  • DRF

    在 app 目录下的 utils 目录下创建 throttle.py

    throttle.py:

    from rest_framework.throttling import SimpleRateThrottle
    import time
    
    
    # 访问记录
    VISIT_RECORD = {}
    
    
    # 用于游客的访问控制
    class VisitThrottle(SimpleRateThrottle):
        # 设置 settings.py 中访问频率的字典的 key
        scope = "anonymous"  # 获取设定的访问频率
    
        def get_cache_key(self, request, view):
            # 取 IP 地址作为访问记录 VISIT_RECORD 的标识 key
            return self.get_ident(request)
    
    
    # 用于用户的访问控制
    class UserThrottle(SimpleRateThrottle):
        # 设置 settings.py 中访问频率的字典的 key
        scope = "user"  # 获取设定的访问频率
    
        def get_cache_key(self, request, view):
            # 取用户名作为访问记录 VISIT_RECORD 的标识 key
            return request.user.username
    

    auth.py:

    from rest_framework.authentication import BaseAuthentication
    from drf import models
    from rest_framework.exceptions import AuthenticationFailed
    
    
    # 用于全局认证
    class GlobalAuthentication(BaseAuthentication):
        def authenticate(self, request):
            token = request._request.GET.get("token")
            token_obj = models.UserToken.objects.filter(token=token).first()
            if not token_obj:
                raise AuthenticationFailed("用户认证失败")
            return (token_obj.user, None)
    
        def authenticate_header(self, request):
            pass
    

    settings.py 中设置全局访问频率类和访问频率

    REST_FRAMEWORK = {
        # 全局使用的认证类
        "DEFAULT_AUTHENTICATION_CLASSES": ["drf.utils.auth.GlobalAuthentication", ],
        # 全局使用的访问频率
        "DEFAULT_THROTTLE_CLASSES": ["drf.utils.throttle.VisitThrottle"],
        # 通过字典设置访问频率
        "DEFAULT_THROTTLE_RATES":{
            "anonymous": "3/m",  # 每分钟 3 次
            "user": "10/m",  # 每分钟 10 次
        }
    }
    

    关于设定的访问频率的时间

    分别对应秒、分、时、天,/ 前为规定的数

    views.py:

    from django.http import JsonResponse
    from rest_framework.views import APIView
    from drf.utils.throttle import UserThrottle
    
    
    ORDER_DICT = {
        1: {
            "commodity": "Phone",
            "price": 3600,
            "date": "2021-01-03",
        },
        2: {
            "commodity": "Computer",
            "price": 6700,
            "date": "2021-01-05",
        },
    }
    
    
    class OrderView(APIView):
        """
        查看订单
        """
    
        def get(self, request, *args, **kwargs):
            response = {"code": 1000, "msg": None, "data": None}
            try:
                response["data"] = ORDER_DICT
            except Exception as e:
                pass
            return JsonResponse(response)
    
    
    USER_DICT = {
        1: {
            "name": "John",
            "password": "John123",
            "phone": "20210103",
        },
        2: {
            "name": "Jack",
            "password": "Jack456",
            "phone": "20210105",
        },
    }
    
    
    class UserinfoView(APIView):
        """
        查看用户信息
        """
    
        # 设置局部访问频率类
        throttle_classes = [UserThrottle, ]
    
        def get(self, request, *args, **kwargs):
            response = {"code": 1000, "msg": None, "data": None}
            try:
                response["data"] = USER_DICT
            except Exception as e:
                pass
            return JsonResponse(response)
    

    访问 /userinfo/?token=b9d56bfaeba57885b63dd0081c97c1d2,1 分内访问 10 次后

  • 相关阅读:
    cast() 函数进行类型转换
    '+' 拼接字符串引起的小事故
    shell统计ip访问情况并分析访问日志
    Windows 环境上域名配置
    WebApi中Route的作用
    Postman测试WebApi使用总结
    C# VS2017新建WepApi
    C# 反射总结
    winform--同一个项目窗体复制
    winform TextBox设置透明
  • 原文地址:https://www.cnblogs.com/sch01ar/p/14290792.html
Copyright © 2011-2022 走看看