Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
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,不然修改的代码不会生效
Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步的更多相关文章
- Django商城项目笔记No.5用户部分-注册接口-短信验证码
Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...
- Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...
- Django商城项目笔记No.8用户部分-注册接口实现
Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...
- Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在
Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...
- Django商城项目笔记No.4用户部分-注册接口-图片验证码
Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...
- Django商城项目笔记No.10用户部分-登录接口
Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
- Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址
Django商城项目笔记No.11用户部分-QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联 ...
- Django商城项目笔记No.3用户部分-用户模型类
Django商城项目笔记No.3用户部分-用户模型类 Django提供了认证系统,文档资料https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index ...
随机推荐
- 几种常见算法的Python实现
1.选择排序 选择排序是一种简单直观的排序算法.它的原理是这样:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的后 ...
- 并发编程—— LinkedTransferQueue
1. 前言 Java 中总的算起来有 8 种阻塞队列. 我们分析了: 并发编程之 SynchronousQueue 核心源码分析 并发编程之 ConcurrentLinkedQueue 源码剖析 并发 ...
- sql union 语句 case语句
1:Union语句: 把两个结果合为一体(但是完全重复的数据会去掉) Eg1: select name, age, ‘学生无工资’ from student union ...
- Codeforces485D(SummerTrainingDay01-K)
D. Maximum Value time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...
- vue中的js引入图片,必须require进来
需求:如何components里面的index.vue怎样能把assets里面的图片拿出来. 1.在img标签里面直接写上路径: <img src="../assets/a1.png& ...
- JS UNIX 时间戳与时间格式转换
上代码,不多说了,这个没啥说的,记录一下: var date = new Date() // Date 2019-03-05T13:50:39.775Z // 获取1970 至今的毫秒数 var ti ...
- 小程序 js中获取时间new date()的用法(网络复制过来自用)
js中获取时间new date()的用法 获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获 ...
- js-对象深度克隆方法
学习收藏. 1.来自http://www.cnblogs.com/yxz-turing/p/4784861.html function cloneObj(obj){ var str, newobj = ...
- pms前端结构
后台采用.net MVC框架,前端采用requirejs.整个系统页面布局基本不变,每个页面只改变Main_Content部分. 模板页cshtml: <!DOCTYPE html> &l ...
- element-ui table
额,最近有点频繁记录.感觉遇到了很多的问题.然后不断的查,不断的尝试修改.然后得到解决.还是记录关于element-ui的使用.这次是关于表格的使用. 表格使用其实平时用的话也就那么几个属性.虽然官网 ...