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

时间:2022-04-27 14:24:33

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

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

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

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

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


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

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

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

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

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

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

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

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

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

添加白名单,这个配置放在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

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

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

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

查询redis中也有数据:

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

认识celery

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

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

分析图

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

安装celery:

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

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

Celery目录搭建

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

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

最终celery目录结构如下:

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

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

config.py是用于配置broker的

main是celery的主入口文件

代码如下:

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)

celery任务启动方法

celery -A celery_tasks.main worker -l info

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

启动之后

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

测试

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

控制台

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

注意

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