程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django請求頻率限制

編輯:Python

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()

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved