borntodie

短信验证码接口

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)),
]

分类:

技术点:

相关文章: