【愚公系列】2022年04月 Python教学课程 73-DRF框架之限流

举报
愚公搬代码 发表于 2022/04/20 00:17:35 2022/04/20
【摘要】 一、限流限流类似于权限,因为它确定是否应对请求进行授权。限制指示临时状态,用于控制客户端可以向 API 发出的请求速率。与权限一样,可以使用多个限制。您的 API 可能对未经身份验证的请求设置了限制性限制,对经过身份验证的请求的限制性限制较少。您可能希望使用多个限制的另一种情况是,由于某些服务特别占用资源,因此您需要对 API 的不同部分施加不同的约束。如果要同时施加突发节流速率和持续节流...

一、限流

限流类似于权限,因为它确定是否应对请求进行授权。限制指示临时状态,用于控制客户端可以向 API 发出的请求速率。

与权限一样,可以使用多个限制。您的 API 可能对未经身份验证的请求设置了限制性限制,对经过身份验证的请求的限制性限制较少。

您可能希望使用多个限制的另一种情况是,由于某些服务特别占用资源,因此您需要对 API 的不同部分施加不同的约束。

如果要同时施加突发节流速率和持续节流速率,也可以使用多个节流阀。例如,您可能希望将用户限制为每分钟最多 60 个请求,每天最多 1000 个请求。

限制不一定仅指速率限制请求。例如,存储服务可能还需要限制带宽,而付费数据服务可能希望限制正在访问的一定数量的记录。

REST 框架提供的应用程序级限制不应被视为安全措施或针对暴力破解或拒绝服务攻击的保护。故意的恶意行为者将始终能够欺骗 IP 源,应用程序级限制旨在实现策略,例如不同的业务层和防止服务过度使用的基本保护。

1.全局设置

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

2.视图设置

from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = [UserRateThrottle]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

3.装饰器设置

@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):
    content = {
        'status': 'request was permitted'
    }
    return Response(content)

4.装饰器创建的路由设置限制类

@action(detail=True, methods=["post"], throttle_classes=[UserRateThrottle])
def example_adhoc_method(request, pk=None):
    content = {
        'status': 'request was permitted'
    }
    return Response(content)

二、限流缓存

REST框架提供的限制类使用Django的缓存后端。您应确保已设置适当的缓存设置。后端的默认值应该适用于简单的设置。请参阅 Django 的缓存文档以获取更多详细信息。LocMemCache

如果需要使用 除 以外的高速缓存,可以通过创建自定义限制类并设置属性来执行此操作。例如:

from django.core.cache import caches

class CustomAnonRateThrottle(AnonRateThrottle):
    cache = caches['alternate']
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。