使用celery 异步发送短信 (celery一般用来处理比较耗时间的请求)

1. 安装celery

pip install celery

2. 使用

项目根目录下下创建celery_tasks用于保存celery异步任务。

  1. 在celery_tasks目录下创建config.py文件,用于保存celery的配置信息
# config.py
broker_url = "redis://127.0.0.1/15"
  1. 在 celery_tasks 目录下创建main.py 文件

    # main.py
    import osfrom celery import Celery# 为celery 使用django 进行配置if not os.getenv('DJANGO_SETTINGS_MODULE'):# os.environ('DJANGO_SETTINGS_MODULE', 'cheng_pro.settings')     # 这个文件是从 manage.py 文件中复制过来的os.environ['DJANGO_SETTINGS_MODULE'] = 'cheng_pro.settings'    # 这样子写也可以,赋一个值# 创建一个实例
    app = Celery('sms_captcha')# 导入配置
    app.config_from_object('celery_tasks.config')        # config.py 配置文件# 自定义注册任务
    app.autodiscover_tasks(['celery_tasks.sms'])    # 加入发送短信任务
    
    1. 在celery_tasks目录下创建sms目录,用于放置发送短信的异步任务相关代码。 如果以后要发送邮件,则再在该文件夹(celery_tasks)下创建一个email之类的目录,存放相应的代码就可以了

    2. 在celery_tasks/sms/目录下创建task.py文件,用于保存发送短信的异步任务

      # celery_tasks/sms/task.py
      import loggingfrom celery_tasks.main import app
      from utils.aliyum.aliyum import send
      from utils.json_res import json_response
      from utils.res_code import Code, error_maplogger = logging.getLogger('django')# 发送短信验证码
      @app.task(name='send_sms_captcha')
      def send_sms_captcha(mobile, captcha):"""发送短信:return:"""try:res = send(mobile, captcha)except Exception as e:logger.error('发送短信异常{{ {mobile}: {captcha}, e: {e} }}'.format(mobile=mobile, captcha=captcha, e=e))return 0else:if res == '发送短信失败':logger.warning('向 {} 发送短信失败'.format(mobile))return 0else:logger.info('向 {} 发送短信验证码成功: {{ {}: {} }}'.format(mobile, mobile, captcha))return 1
      
      1. 改写 发送短信视图

        # views.py      使用 celery 异步发送短信  (处理耗时任务)
        def send_sms_captcha(request):"""发送短信验证码url: /sms_captcha/method:  POST:param request::return:"""# 1. 创建表单, 校验参数form = CheckSendSmsCaptcha(request.POST)# 2. 校验参数, 返回结果if form.is_valid():# 校验通过# 获取需要的参数mobile = form.cleaned_data.get('mobile')# 生成要发送的短信验证码内容captcha = ''.join([random.choice(string.digits) for _ in range(6)])logger.info('要发送的短信验证码内容为: {}'.format(captcha))# 使用 celery 异步发送短信res = sms_task.send_sms_captcha(mobile, captcha)if res == 1:# 短信验证码发送成功# 存储redis_conn = get_redis_connection(alias='verification')pipeline = redis_conn.pipeline()try:redis_conn.setex('sms_{}'.format(mobile), 500, captcha)redis_conn.setex('sms_flag_{}'.format(mobile), 60, mobile)pipeline.execute()except Exception as e:logger.error('redis执行异常, {{ e: {} }}'.format(e))return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])   # 返回未知错误return json_response(errmsg='短信验证码发送成功')else:# 发送短信失败return json_response(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR])# """# # 发送短信# res = send(mobile, captcha)# if res == '发送短信失败':#     logger.warning('向 {} 发送短信失败'.format(mobile))#     return json_response(errno=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL])## # 保存短信验证码 和  该手机号码的 发送记录# redis_conn = get_redis_connection(alias='verification')  # 连接redis# pipeline = redis_conn.pipeline()   # 建立redis 管道# try:#     redis_conn.setex('sms_captcha_{}'.format(mobile), 500, captcha)#     # 保存60s发送记录#     redis_conn.setex('sms_flag_{}'.format(mobile), 60, mobile)#     # 执行#     pipeline.execute()## except Exception as e:#     # redis执行异常#     logger.warning('redis执行异常, {}'.format(e))#     # 返回未知错误#     return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])## logger.info('成功向 {} 发送短信, captcha: {}'.format(mobile, captcha))# return json_response(errmsg='短信验证码发送成功,请注意查收')# """else:# 校验不通过logger.error(form.errors)   # 记录个日志# 定义一个空的错误信息列表err_msg_list = []for items in form.errors.get_json_data().values():err_msg_list.append(items[0].get('message'))# 将所有错误信息拼接成字符串err_msg_str = '/'.join(err_msg_list)return json_response(errno=Code.PARAMERR, errmsg=err_msg_str)
        1. 创建 workon 任务

          在终端中,进入到与celery_tasks 同级的目录下(我上面是创建到项目根目录下了), 所以我们此时进入到项目的根目录下, 执行以下命令:

          celery -A celery_tasks.main worker -l info-A 选项指定 celery 实例 app 的位置-l 选项指定日志级别, -l 是 --loglevel 的缩略形式

转载于:https://www.cnblogs.com/nichengshishaonian/p/11590410.html

29_使用celery发送短信相关推荐

  1. Celery实现短信注册接口

    介绍: 1.1 celery应用举例 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用cele ...

  2. 使用容联云Celery异步发送短信验证码

    文章目录 Celery/容联云 安装与命令 安装 celery启动命令 一.Celery 1.配置Celery 2.创建任务文件 二.容联云 1. 配置容联云 settings.py 2. 使用Sms ...

  3. 手机异步发送短信验证码解决方案-Celery+redis

    Celery介绍和使用 一.Celery介绍: 一个简单.灵活且可靠.处理大量消息的分布式系统,可以在一台或者多台机器上运行. Celery是一个功能完备即插即用的任务队列 单个 Celery 进程每 ...

  4. 魔方APP项目-06-用户注册,完成短信验证码的校验、基于Celery实现短信异步发送、用户登录,jwt登陆认证、服务端提供用户登录的API接口

    一.用户注册- 1.完成短信验证码的校验 application.utils.language.message,代码: class ErrorMessage():ok = "ok" ...

  5. luffcc项目-06-使用容联云发送短信、Celery

    一.使用容联云发送短信 https://www.yuntongxun.com/ 目录结构 sms.py import json from .SmsSDK import SmsSDK from djan ...

  6. Flask项目--发送短信验证码

    1.后端代码 具体代码如下: # GET /api/v1.0/sms_codes/<mobile>?image_code=xxxx&image_code_id=xxxx @api. ...

  7. flask容联云发送短信验证码和异步发送

    容联云地址:https://www.yuntongxun.com/ 获取短信验证码流程图 容联云配置 在容联云官网注册一个账号,发送短信验证码必须使用三个ID ACCOUNT SID   (主账户ID ...

  8. 美多商城项目发送短信优化

    #发送短信优化 阻止请求频繁 + 管道优化redis储存 + celery异步 class SMS_CODEView(APIView):def get(self,request,mobile):con ...

  9. JAVA如何实现发送短信

    今天看到了一个需求,需要做一个发送短信的功能,网上找了找,大概有这几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册;( ...

最新文章

  1. 20018-05-16 第十天
  2. CMake编译Makefile
  3. Cisco常见路由器密码和版本恢复方法
  4. php 检测数组内是否有空值,PHP判断数组是否为空的常用方法
  5. IOS添加pch预编译文件
  6. Spring Data Solr教程:CRUD(差不多)
  7. linux标准I/O——按行输入和输出
  8. Linux网络协议栈:网络包接收过程
  9. 幻想英雄2-战神再起折扣号新手入门攻略
  10. 项目周期一般多久_收藏!布袋除尘器清灰周期一般多久合适?
  11. Oracle分页总汇
  12. 写了一百万行代码是什么体验?
  13. JAVAWeb项目 微型商城项目-------(七)后台添加用户管理和商品类型管理操作
  14. linux下STM32开发环境搭建
  15. SNP基因数据质控调研
  16. 未能加载“xxx”程序集
  17. 计算机专业夏令营英语面试范文,夏令营面试英文自我介绍
  18. java eml 附件_向EML文件追加附件的Java实现
  19. 本地通用验证码识别DLL/通用滑块识别/文字点选/图标点选/OCR文字识别/本地识别DLL
  20. 通俗易懂看RB-tree(二)

热门文章

  1. 利用App漏洞获利2800多万元,企业该如何避免类似事件?
  2. 123D Design安装与汉化
  3. Sober主题英文版 WordPress响应式 电子商务主题
  4. 疲劳驾驶数据集_奥迪开放的自动驾驶数据集
  5. 智取天狼星计划(二)
  6. 第12期《大风起兮云飞扬》12月刊
  7. wifi频谱仪测试软件,WiFi测试小知识之十七:频谱图
  8. 联华超市构建商业智能系统
  9. 2022年建筑三类人员C1证考试题,建筑三类人员考试搜题
  10. VPS2105 无光耦 DCDC 电源控制器 4-100VIN/120V/4A 功率管