短信验证码接口
user/throttles.py
from rest_framework.throttling import SimpleRateThrottle
class SmsThrottling(SimpleRateThrottle):
scope = \'sms\'
def get_cache_key(self, request, view):
# 获取手机号码并校验是否符合格式
telephone = request.query_params.get(\'telephone\')
# cache_format = \'throttle_%(scope)s_%(ident)s\'
return self.cache_format%{\'scope\':self.scope,\'ident\':telephone}
settings/dev.py
# drf配置
REST_FRAMEWORK = {
# 自定义短信发送频率配置
\'DEFAULT_THROTTLE_RATES\': {
\'sms\': \'1/m\' # key要跟类中的scop对应
}
}
user/views.py
class SendSmsView(ViewSet):
throttle_classes = (SmsThrottling,)
# 发送短信验证码接口视图
@action(methods=(\'GET\',), detail=False)
def send(self, request, *args, **kwargs):
# 获取手机号码并校验是否符合格式
telephone = request.query_params.get(\'telephone\')
if not re.match(\'^1[3-9][0-9]{9}$\', telephone): # 当电话号码格式不正确
return APIResponse(code=0, msg=\'Error\', result=\'号码格式不正确!\')
# 获取随机验证码,因为没有腾讯短信,所以这里就手动生成验证码
code = get_code()
print("当前验证码是:", code)
# 发送手机短信
result = send_message(telephone, code)
if result: # 这是发送成功
# 发送验证码成功后,需要将验证码保存起来,方便后期登录使用
# cache(缓存的键,缓存的值,缓存保存时间),这里验证码先不存缓存
cache.set(settings.PYTHON_CACHE_KEY.format(telephone), code, 180)
return APIResponse(code=1, msg=\'Successful\', result=\'验证发送成功\')
else: # 这是发送失败
return APIResponse(code=0, msg=\'Error\', result=\'您操作太频繁了,验证发送失败\')
user.urls.py
from django.urls import path, include
from rest_framework.routers import SimpleRouter
from . import views
router = SimpleRouter()
router.register(\'\', views.SendSmsView, \'send\') # 此处第一个参数不要加上,因为视图类中使用了actions,会把该视图名添加进来
urlpatterns = [
path(\'\', include(router.urls)),
]