当前位置: 代码迷 >> 综合 >> celery 发送短信接口
  详细解决方案

celery 发送短信接口

热度:80   发布时间:2024-02-25 18:28:44.0

1. 使用celery异步发送短信


1.1 在 在celery_task/mian.py中添加发送短信函数

# celery 项目命令中的所有导包地址,都是以CELERY_BASE_DIR为基准设定
# 执行celery命令时,也需要进入 CELERY_BASE_DIR目录执行
CELERY_BASE_DIR = os.path.dirname(os.path.abspath(__file__))@app.task(bind=True)
def send_sms_code(self, mobile, datas):sys.path.insert(0, os.path.join(CELERY_BASE_DIR, '../syl'))# 在方法中导包from libs.rl_sms import send_message# time.sleep(5)try:# 用 res 接收发送结果, 成功是:0, 失败是:-1res = send_message(mobile, datas)except Exception as e:res = '-1'if res == '-1':# 如果发送结果是 -1 就重试.self.retry(countdown=5, max_retries=3, exc=Exception('短信发送失败'))

1.2 在verifications/views.py中添加celery发送短信试图函数

class SmsCodeView(APIView):"""使用apiview的限流"""# 1. 所有人可以访问permission_classes = (AllowAny,)def post(self, request):# 1. 获取参数phone = request.data.get('phone')  # 手机号image_code = request.data.get('image_code')  # 图片验证码image_code_uuid = request.data.get('image_code_uuid')  # 前端生成的uuid# 2. 检查参数if not all([phone, image_code, image_code_uuid]):return Response({
    "code": 999, "msg": "参数不全"})if not re.match(r'^1[3456789]\d{9}$', phone):return Response({
    "code": 999, "msg": "手机号码不正确"})# 3. 检查是否发送redis_client = get_redis_connection('img_code')phone_exists = redis_client.get(phone)if phone_exists:return Response({
    "code": 999, "msg": "频繁发送, 请稍后再试"})# 验证图形验证码redis_image_code = redis_client.get(image_code_uuid)  # bytesif redis_image_code:# bytes 转成 stringredis_image_code = redis_image_code.decode()# 比较用户提供的图片内容是否和redis中保存的一致if image_code.upper() != redis_image_code:return Response({
    'code': 999, 'msg': '图片验证码不正确'})# 4. 发送code = '%06d' % random.randint(0, 999999)  # 随机6位验证码from syl.settings import BASE_DIRsys.path.insert(0, os.path.join(BASE_DIR, '../celery_task'))from main import send_sms_code  # 必须这么写, 从main中导包send_sms_code.delay(phone, (code, "5"))print(code)# 5.使用 pipeline 批量操作pl = redis_client.pipeline()    # 实例化pipeline对象pl.setex(phone, 60 * 5, code)   # 存储phone:code, 5分钟有效期pl.delete(image_code_uuid)      # 从redis中删除这个图片验证码, 以防再次被使用pl.execute()# 6. 返回结果return Response({
    "code": 0, "msg": "短信发送成功"})

1.3 添加路由

urlpatterns = [path('sms_codes/',views.SmsCodeView.as_view()),
]

2. 测试接口


  • 接口URL
http://192.168.56.100:8888/user/sms_codes/
  • 请求携带参数
{
    "phone":18538752511"image_code":'aed3'
验证码"image_code_uuid":"de8edce2-fc9f-11ea-9325-005056c00008"
}