栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django请求频率限制

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号