Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步
接上一篇,如何解决前后端请求跨域问题?
首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site:8000,可是不会造成这样的错误呢?
因为图片验证码的请求其实是由浏览器本身发起的(修改img的src,浏览器发起请求),而点击获取验证码是由我们自己的代码主动发起的请求。
所以图片验证码不会出现跨站请求
我们需要先了解一个事情:
在发起跨站请求的时候,浏览器会发送一个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的
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代码都已经删掉了:
启动之后
测试
控制台
注意
在测试celery的时候,如果有修改任务的代码,比如修改了send_sms_code函数的代码,那就需要注意,需要重启worker,不然修改的代码不会生效