• Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步


    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步

    接上一篇,如何解决前后端请求跨域问题?

    首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site:8000,可是不会造成这样的错误呢?

    因为图片验证码的请求其实是由浏览器本身发起的(修改imgsrc,浏览器发起请求),而点击获取验证码是由我们自己的代码主动发起的请求。

    所以图片验证码不会出现跨站请求


    我们需要先了解一个事情:

    在发起跨站请求的时候,浏览器会发送一个option方式的请求(Http请求方式的一种),询问后端是否支持跨站请求。如下图描述:

    所以我们增加中间件即可,而这个中间件第三方提供了:

    参考文档https://github.com/ottoyiu/django-cors-headers/

    中间层设置的时候要在最上边设置

    添加白名单,这个配置放在dev的最后即可

    # CORS
    CORS_ORIGIN_WHITELIST = (
        '127.0.0.1:8080',
        'localhost:8080',
        'www.meiduo.site:8080',
        'api.meiduo.site:8000'
    )
    CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie

    再次测试,出现倒计时,OK

    查询redis中也有数据:

     

    认识celery

    分析图

    安装celery

    Celery目录搭建

    最终celery目录结构如下:

     

    sms是专门存放发送短信业务逻辑的代码包

    config.py是用于配置broker

    maincelery的主入口文件

    代码如下:

    config.py

    broker_url = 'redis://127.0.0.1/14'

    main.py

    from celery import Celery
    import os
    
    # 为celery使用django配置文件进行配置
    if not os.getenv('DJANGO_SETTINGS_MODULE'):
        os.environ['DJANGO_SETTINGS_MODULE'] = 'md_mall.settings.dev'
    
    # 创建celery应用
    celery_app = Celery('md_mall')
    
    # 导入celery配置
    celery_app.config_from_object('celery_tasks.config')
    
    # 导入任务
    celery_app.autodiscover_tasks(['celery_tasks.sms'])

    sms/tasks.py

    from rest_framework import status
    from rest_framework.response import Response
    
    from md_mall.utils.yuntongxun.sms import CCP
    import logging
    from celery_tasks.main import celery_app
    
    logger = logging.getLogger('django')
    
    
    @celery_app.task(name='send_sms_code')
    def send_sms_code(mobile, sms_code, expires, temp_id):
        """发送短信验证码"""
        try:
            ccp = CCP()
            result = ccp.send_template_sms(mobile, [sms_code, expires], temp_id)
        except Exception as e:
            logger.error("发送短信验证码[异常][mobile:%s, message:%s]" % (mobile, e))
        else:
            if result == 0:
                logger.info("发送短信验证码[正常][mobile:%s]" % mobile)
            else:
                logger.warning("发送短信验证码[失败][mobile:%s]" % mobile)
    View Code

    celery任务启动方法

    celery -A celery_tasks.main worker -l info

    还有一个问题就是,这个任务执行,已经不需要给前端返回响应了,所以将异步任务里的return response代码都已经删掉了:

     启动之后

     

    测试

    控制台

    注意

    在测试celery的时候,如果有修改任务的代码,比如修改了send_sms_code函数的代码,那就需要注意,需要重启worker,不然修改的代码不会生效

     

  • 相关阅读:
    MySQL 简单查询(实验回顾)
    PicGo + Gitee 创建图床,Typora竟还有这种功能
    SQL 条件判断
    django ORM中的复选MultiSelectField的使用
    with的用法
    django update-or-create的用法
    获取异常文件
    支付宝支付
    单例模式创建
    数据类模型
  • 原文地址:https://www.cnblogs.com/blog-rui/p/9740175.html
Copyright © 2020-2023  润新知