zoukankan      html  css  js  c++  java
  • Django REST framework 内置访问频率控制

    对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。

    from rest_framework.throttling import SimpleRateThrottle
    
    class VisitThrottle(SimpleRateThrottle):
        """匿名用户访问频率限制"""
        scope = "AnonymousUser"  # 随便写的,可以作为key保存在缓存中
    
        def get_cache_key(self, request, view):
            return self.get_ident(request)
    
    class UserThrottle(SimpleRateThrottle):
        """登录用户访问频率限制"""
        scope = "LoginUser"
    
        def get_cache_key(self, request, view):return request.user

    可以配置redis

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                # "PASSWORD": "密码",
            }
        }
    }

    匿名用户的访问频率限制,这里设置在全站下,如下:

    REST_FRAMEWORK = {
        "DEFAULT_THROTTLE_CLASSES": ["appxx.utils.VisitThrottle"],
        "DEFAULT_THROTTLE_RATES":{
                "AnonymousUser": "3/m",  # 匿名用户一分钟可以访问3次,秒(s)、分(m)、时(h)、天(d)
                "LoginUser": "10/m",  # 登录用户一分钟可以访问10次
            }
    }

    登录用户的访问频率设置在单独的视图中,而视图依赖身份认证才能辨别用户是否登陆了,所以设置如下:

    class BookViewSet(viewsets.ModelViewSet):
        authentication_classes = [TokenAuthentication]
        throttle_classes = [UserThrottle]
        queryset = models.Book.objects.all()
        serializer_class = serializers.BookSerializer

    用户身份认证如下:

    from rest_framework import authentication
    from rest_framework import exceptionsfrom appxx import models
    
    class TokenAuthentication(authentication.BaseAuthentication):
        """身份认证"""
        def authenticate(self, request):
            token = request.GET.get("token")
            obj = models.UserAuthToken.objects.filter(token=token).first()
            if not obj:
                raise exceptions.AuthenticationFailed("验证失败!")
            else:
                return (obj.user.username, obj.token)
  • 相关阅读:
    颜色代码 #000~#FFF & DML案例设计
    SQLScript DML 创建 & 查询 & 序列(条件查询 日起查询 关联查询 子查询 分组查询 查询内容拼接 模糊查询)
    Java JDBC 连接数据库 Demo
    document的JavaScript一些用法
    dxSpreadSheet的报表demo-关于设计报表模板问题
    dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
    TJSON的烦人的泄漏
    dxSpreadSheet的报表
    TDXSpreadSheet中自定义公式函数三大步骤
    SVN项目监视器的配置文件
  • 原文地址:https://www.cnblogs.com/believepd/p/10278207.html
Copyright © 2011-2022 走看看