如何在Django项目中实现短信验证码的定时发送?

在Django项目中实现短信验证码的定时发送,是许多开发者需要面对的问题。短信验证码是现代网站和应用程序中常见的功能,用于验证用户的身份和防止恶意行为。以下是如何在Django项目中实现短信验证码定时发送的详细步骤:

一、准备短信验证码服务

首先,需要选择一个可靠的短信验证码服务提供商。市面上有很多优秀的短信验证码服务,如阿里云、腾讯云、华为云等。以下以阿里云短信服务为例,说明如何准备短信验证码服务。

  1. 注册阿里云账号并开通短信服务。
  2. 获取短信服务所需的AccessKey和AccessSecret。
  3. 在阿里云控制台创建短信模板,填写短信内容,如“您的验证码为:123456,有效期为5分钟,请勿泄露给他人。”

二、Django项目配置

  1. 在Django项目中创建一个新的应用,如sms_service
  2. sms_service应用中创建一个models.py文件,用于存储短信验证码信息。
from django.db import models

class SMSCode(models.Model):
phone_number = models.CharField(max_length=11, verbose_name='手机号')
code = models.CharField(max_length=6, verbose_name='验证码')
expire_time = models.DateTimeField(verbose_name='过期时间')

  1. sms_service应用中创建一个views.py文件,用于处理短信验证码发送逻辑。
from django.http import JsonResponse
from .models import SMSCode
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from datetime import datetime, timedelta

# 初始化阿里云短信服务客户端
client = AcsClient('AccessKeyId', 'AccessSecret', 'cn-hangzhou')

def send_sms(phone_number, code):
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_version('2017-05-25')
request.set_action_name('SendSms')

request.add_query_param('PhoneNumbers', phone_number)
request.add_query_param('SignName', '你的签名')
request.add_query_param('TemplateCode', '短信模板Code')
request.add_query_param('TemplateParam', '{"code": "' + code + '"}')

response = client.do_action_with_exception(request)
return response

  1. sms_service应用中创建一个urls.py文件,用于配置路由。
from django.urls import path
from . import views

urlpatterns = [
path('send_code/', views.send_sms, name='send_code'),
]

三、定时发送短信验证码

在Django项目中,可以使用celery任务队列来实现定时发送短信验证码。以下是如何使用celery实现定时发送短信验证码的步骤:

  1. 安装celeryredis
pip install celery redis

  1. 在Django项目中创建一个celery.py文件,配置celery
from celery import Celery

# 设置celery配置
app = Celery('sms_service', broker='redis://localhost:6379/0')

# 设置celery结果存储
app.conf.result_backend = 'redis://localhost:6379/0'

  1. sms_service应用中创建一个tasks.py文件,定义定时发送短信验证码的任务。
from celery import shared_task
from .models import SMSCode
from .views import send_sms

@shared_task
def send_code_task(phone_number):
# 生成验证码
code = '123456' # 这里可以使用随机数生成器生成验证码

# 存储验证码信息
sms_code = SMSCode(phone_number=phone_number, code=code, expire_time=datetime.now() + timedelta(minutes=5))
sms_code.save()

# 发送短信验证码
send_sms(phone_number, code)

  1. 在Django项目中创建一个tasks.py文件,用于启动celery
from celery import Celery

# 设置celery配置
app = Celery('tasks', broker='redis://localhost:6379/0')

# 设置celery结果存储
app.conf.result_backend = 'redis://localhost:6379/0'

# 加载任务
app.autodiscover_tasks(['sms_service'])

  1. 在Django项目中创建一个views.py文件,用于处理用户请求。
from django.http import JsonResponse
from .tasks import send_code_task

def send_code(request):
phone_number = request.POST.get('phone_number')

if not phone_number:
return JsonResponse({'status': 'error', 'message': '手机号不能为空'})

# 启动定时任务发送短信验证码
send_code_task.delay(phone_number)

return JsonResponse({'status': 'success', 'message': '短信验证码发送成功'})

  1. 在Django项目中创建一个urls.py文件,配置路由。
from django.urls import path
from . import views

urlpatterns = [
path('send_code/', views.send_code, name='send_code'),
]

至此,Django项目中实现短信验证码的定时发送功能已成功完成。用户在请求发送短信验证码时,系统会自动启动定时任务,在规定时间内发送短信验证码。

猜你喜欢:企业智能办公场景解决方案