Django短信验证码模块如何实现验证码的定时发送任务?
在Django项目中,短信验证码模块是用户注册、登录等场景中常见的功能。实现验证码的定时发送任务,可以确保验证码在用户需要时及时发送,提高用户体验。本文将详细介绍Django短信验证码模块如何实现验证码的定时发送任务。
一、短信验证码模块基本架构
数据库模型:创建一个模型用于存储验证码信息,包括手机号、验证码、过期时间等字段。
验证码生成:使用Python内置的random模块生成验证码,通常为6位数字。
短信发送:集成第三方短信服务商API,实现短信发送功能。
定时任务:使用定时任务库(如Celery)实现验证码的定时发送。
二、Django短信验证码模块实现步骤
- 创建数据库模型
from django.db import models
class SMSCode(models.Model):
mobile = models.CharField(max_length=11, verbose_name='手机号')
code = models.CharField(max_length=6, verbose_name='验证码')
expire_time = models.DateTimeField(verbose_name='过期时间')
- 验证码生成
import random
def generate_code():
return ''.join([str(random.randint(0, 9)) for _ in range(6)])
- 短信发送
以阿里云短信服务为例,首先在阿里云控制台创建短信模板,并获取AccessKey和AccessSecret。然后,在Django项目中集成阿里云短信服务。
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
def send_sms(mobile, code):
client = AcsClient('AccessKeyId', 'AccessSecret', 'cn-hangzhou')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms')
request.add_query_param('PhoneNumbers', mobile)
request.add_query_param('SignName', '你的签名')
request.add_query_param('TemplateCode', '你的模板')
request.add_query_param('TemplateParam', '{"code": "' + code + '"}')
response = client.do_action_with_exception(request)
return response
- 定时任务
使用Celery实现定时任务,在任务中调用短信发送函数。
from celery import shared_task
@shared_task
def send_code_task(mobile):
code = generate_code()
send_sms(mobile, code)
SMSCode.objects.create(mobile=mobile, code=code, expire_time=timezone.now() + timedelta(minutes=5))
- 触发定时任务
在用户请求发送验证码时,调用定时任务函数。
from django.utils import timezone
from datetime import timedelta
def send_code(request):
mobile = request.POST.get('mobile')
if not mobile:
return JsonResponse({'status': 0, 'message': '手机号不能为空'})
if SMSCode.objects.filter(mobile=mobile, expire_time__gt=timezone.now()).exists():
return JsonResponse({'status': 0, 'message': '验证码已发送,请稍后再试'})
send_code_task.delay(mobile)
return JsonResponse({'status': 1, 'message': '验证码发送成功'})
三、总结
通过以上步骤,实现了Django短信验证码模块的定时发送任务。在实际项目中,可以根据需求调整验证码过期时间、短信服务商等参数。定时任务可以确保验证码在用户需要时及时发送,提高用户体验。
猜你喜欢:小程序即时通讯