Synchnorized 多线程 程序栈 swift postman Avalon Plupload vue绑定点击事件 后台模板下载 jq去除空格 mysql自连接 matlab自然对数 matlab不等于怎么表示 python命令行参数 python如何定义变量 java开发 java中scanner java入门教程 安装java环境 java的正则表达式 java学习教程 java安装配置 如何安装java环境 java基础课程 java时间戳转日期 java时间类型 vb编程 刺激战场脚本 视频字幕提取器 begininvoke 谷歌地球用不了 excel应用大全 蓝牙测试软件 qq钱包实名认证 ps蒙版抠图详细教程 php正则匹配 python图片处理 fireworks序列号 文件压缩工具 速查表
当前位置: 首页 > 学习教程  > 编程语言

celery发送短信

2020/10/8 19:09:28 文章标签:

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(b…

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, 失败是:-1
        res = 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)  # bytes
        if redis_image_code:
            # bytes 转成 string
            redis_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_DIR
        sys.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": "短信发送成功"})

本文链接: http://www.dtmao.cc/news_show_250094.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?