Django请求频率限制

Django

两种方式:

  1. django-ratelimit
  2. django restframework的throttling

首先 restframework的throttling

serializers.py
from rest_framework.throttling import AnonRateThrottle
class PostSearchAnonRateThrottle(AnonRateThrottle):
    THROTTLE_RATES = {"anon": "6/min"}


views.py
class User_relationship(GenericAPIView, mixins.ListModelMixin):
    queryset = models.Person_relationship.objects.all()
    serializer_class = Person_relationshipserializers1
    throttle_classes = [PostSearchAnonRateThrottle]

    def get(self,request):
        user_id = int(request.GET.get("user_id"))
        query_set = self.filter_queryset(self.get_queryset())
        serializer_datas = self.serializer_class(instance=query_set.filter(person_id=user_id), many=True).data
        result = ts.result_data(status.HTTP_200_OK, serializer_datas, "查询成功")
        return Response(result)

my_middleware.py
class ExceptionChange:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_template_response(self, request, response):
        if hasattr(response, 'data'):
            data = response.data
            status = None
            message = None
            if isinstance(data, dict) is True:
                if "detail" in data.keys():
                    if "Request was throttled. " in data.get("detail"):
                        surplus_seconds = re.findall(r"\d+", data.get("detail"))[0]
                        del response.data["detail"]
                        status = 401
                        message = f"访问频率过高,请在{surplus_seconds}秒后访问"
                    else:
                        del response.data["detail"]
                        status = 401
                        message = "登录已过期,请重新登录"
                if status and message:
                    response.data["status"] = status
                    response.data["data"] = None
                    response.data["message"] = message
        return response

然后是

from ratelimit.decorators import ratelimit
from django.utils.decorators import method_decorator

class MyView(View):
    @method_decorator(ratelimit(key='ip', rate='1/m', method='GET', block=True))
    def get(self, request):
        pass

@method_decorator(ratelimit(key='ip', rate='1/m', method='GET', block=True), name='get')
class MyOtherView(View):
    def get(self, request):
        pass

from ratelimit.decorators import ratelimit


@ratelimit(key='ip', rate='5/m', block=True)
def myview(request):
    # 同一IP每分钟访问超过5次,会被限制
    return HttpResponse()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值