43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
from django.core.exceptions import ImproperlyConfigured
|
|
from rest_framework.exceptions import APIException
|
|
from rest_framework.throttling import SimpleRateThrottle
|
|
|
|
|
|
class ThrottleBase(SimpleRateThrottle):
|
|
"""
|
|
接口访问频率限制基类
|
|
"""
|
|
throttled_message = '请求评率超过限制'
|
|
rate = '3/m'
|
|
|
|
def get_cache_key(self, request, view):
|
|
super().get_cache_key(request, view)
|
|
|
|
def allow_request(self, request, view):
|
|
flag = super().allow_request(request, view)
|
|
if not flag:
|
|
raise APIException(detail=self.throttled_message, code=500)
|
|
return flag
|
|
|
|
def get_rate(self):
|
|
"""
|
|
Determine the string representation of the allowed request rate.
|
|
"""
|
|
if not getattr(self, 'scope', None):
|
|
msg = ("You must set either `.scope` or `.rate` for '%s' throttle" %
|
|
self.__class__.__name__)
|
|
raise ImproperlyConfigured(msg)
|
|
return self.rate
|
|
|
|
|
|
class PhoneCodeThrottle(ThrottleBase):
|
|
rate = '1/m'
|
|
scope = "phone_code"
|
|
throttled_message = "您的请求频率过快,请稍后再试。"
|
|
|
|
def get_cache_key(self, request, view):
|
|
return self.cache_format % {
|
|
'scope': self.scope,
|
|
'ident': f"{request.data.get('mobile')}-{request.data.get('business')}"
|
|
}
|