不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • python基础

  • python模块

  • django

  • flask

  • SYL

    • day01

    • day02

    • day03

    • day04

      • 00.作业
      • 01.celery原理与组件
      • 02.celery配置与基本使用
      • 03.celery发送短信接口
        • 04.vue发送短信逻辑
        • 05.检查用户名是否使用接口
        • 06.vue检查用户名是否使用
        • 07.后端注册接口完善
      • day05

      • day06

      • day07

      • day08

      • day09

      • day10

      • day11

      • day12

    • Celery

    • 微服务

    • python
    • SYL
    • day04
    xiaonaiqiang
    2021-03-10
    目录

    03.celery发送短信接口

    # 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 utils.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
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    # 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": "频繁发送, 请稍后再试"})
    
            # 4.检查验证图形验证码
            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': '图片验证码不正确'})
    
            # 5. 发送
            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)
    
            # 6.使用 pipeline 批量操作
            pl = redis_client.pipeline()    # 实例化pipeline对象
            pl.setex(phone, 60 * 5, code)   # 存储phone:code, 5分钟有效期
            pl.delete(image_code_uuid)      # 从redis中删除这个图片验证码, 以防再次被使用
            pl.execute()
    
            # 7. 返回结果
            return Response({"code": 0, "msg": "短信发送成功"})
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51

    # 1.3 添加路由

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

    # 2.测试接口

    • 接口URL
    http://192.168.56.100:8888/user/sms_codes/
    
    1
    • 请求携带参数
    {
        "phone": 18538752511,
        "image_code":"aed3",                                         # 前端生成的 图形验证码
        "image_code_uuid":"de8edce2-fc9f-11ea-9325-005056c00008"     # 前端生成的uuid
    }
    
    1
    2
    3
    4
    5
    上次更新: 2024/3/13 15:35:10
    02.celery配置与基本使用
    04.vue发送短信逻辑

    ← 02.celery配置与基本使用 04.vue发送短信逻辑→

    最近更新
    01
    04.数组双指针排序_子数组
    03-25
    02
    08.动态规划
    03-25
    03
    06.回溯算法
    03-25
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式