Celery实现短信注册接口
介绍:
1.1 celery应用举例
Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery
你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情
Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis
1.2 Celery有以下优点
- 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
- 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
- 快速:一个单进程的celery每分钟可处理上百万个任务
- 灵活: 几乎celery的各个组件都可以被扩展及自定制
1.3 Celery 特性
- 方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.
- 可选 多进程, Eventlet 和 Gevent 三种模型并发执行.
- Celery 是语言无关的.它提供了python 等常见语言的接口支持.
Celery组件
2.1 Celery 扮演生产者和消费者的角色
Celery Beat : 任务调度器. Beat 进程会读取配置文件的内容, 周期性的将配置中到期需要执行的任务发送给任务队列.
Celery Worker : 执行任务的消费者, 通常会在多台服务器运行多个消费者, 提高运行效率.
Broker : 消息代理, 队列本身. 也称为消息中间件. 接受任务生产者发送过来的任务消息, 存进队列再按序分发给任务消费方(通常是消息队列或者数据库).
Producer : 任务生产者. 调用 Celery API , 函数或者装饰器, 而产生任务并交给任务队列处理的都是任务生产者.
Result Backend : 任务处理完成之后保存状态信息和结果, 以供查询.
2.2 celery架构图
2.3 产生任务的方式
发布者发布任务(WEB 应用)
任务调度按期发布任务(定时任务)
2.4 celery 依赖三个库: 这三个库, 都由 Celery 的开发者开发和维护.
billiard :
基于 Python2.7 的 multisuprocessing 而改进的库, 主要用来提高性能和稳定性.librabbitmp :
C 语言实现的 Python 客户端kombu :
Celery 自带的用来收发消息的库, 提供了符合 Python 语言习惯的, 使用 AMQP 协议的高级借口.
配置Celery
安装celery
pip install celery @ https://github.com/celery/celery/tarball/master
新建celery/main.py
配置celery
# celery_task/main.py
import os
from celery import Celery# 定义celery实例, 需要的参数, 1, 实例名, 2, 任务发布位置, 3, 结果保存位置
app = Celery('mycelery',broker='redis://127.0.0.1:6379/14', # 任务存放的地方 backend='redis://127.0.0.1:6379/15') # 结果存放的地方@app.task
def add(x, y):return x + y
测试
启动celery
'''1.启动celery'''
#1.1 单进程启动celery
celery -A main worker -l INFO
#1.2 celery管理
celery multi start celery_test -A celery_test -l debug --autoscale=50,5 # celery并发数:最多50个,最少5个
ps auxww|grep "celery worker"|grep -v grep|awk '{print $2}'|xargs kill -9 # 关闭所有celery进程
1.使用celery异步发送短信
1.1 在celery_task/mian.py
中添加发送短信函数
# celery项目中的所有导包地址, 都是以CELERY_BASE_DIR为基准设定.
# 执行celery命令时, 也需要进入CELERY_BASE_DIR目录执行.
CELERY_BASE_DIR = os.path.dirname(os.path.abspath(__file__))@app.task(bind=True)
def send_sms_code(self, mobile, datas):sys.path.insert(0, os.path.join(CELERY_BASE_DIR, '../syl'))# 在方法中导包from libs.rl_sms import send_message# time.sleep(5)try:# 用 res 接收发送结果, 成功是:0, 失败是:-1res = send_message(mobile, datas)except Exception as e:res = '-1'if res == '-1':# 如果发送结果是 -1 就重试.self.retry(countdown=5, max_retries=3, exc=Exception('短信发送失败'))
1.2 在verifications/views.py
中添加celery发送短信视图函数
class SmsCodeView(APIView):"""使用apiview的限流"""# 1. 所有人可以访问permission_classes = (AllowAny,)def post(self, request):# 1. 获取参数phone = request.data.get('phone') # 手机号image_code = request.data.get('image_code') # 图片验证码image_code_uuid = request.data.get('image_code_uuid') # 前端生成的uuid# 2. 检查参数if not all([phone, image_code, image_code_uuid]):return Response({"code": 999, "msg": "参数不全"})if not re.match(r'^1[3456789]\d{9}$', phone):return Response({"code": 999, "msg": "手机号码不正确"})# 3. 检查是否发送redis_client = get_redis_connection('img_code')phone_exists = redis_client.get(phone)if phone_exists:return Response({"code": 999, "msg": "频繁发送, 请稍后再试"})# 验证图形验证码redis_image_code = redis_client.get(image_code_uuid) # bytesif redis_image_code:# bytes 转成 stringredis_image_code = redis_image_code.decode()# 比较用户提供的图片内容是否和redis中保存的一致if image_code.upper() != redis_image_code:return Response({'code': 999, 'msg': '图片验证码不正确'})# 4. 发送code = '%06d' % random.randint(0, 999999) # 随机6位验证码from syl.settings import BASE_DIRsys.path.insert(0, os.path.join(BASE_DIR, '../celery_task'))from main import send_sms_code # 必须这么写, 从main中导包send_sms_code.delay(phone, (code, "5"))print(code)# 5.使用 pipeline 批量操作pl = redis_client.pipeline() # 实例化pipeline对象pl.setex(phone, 60 * 5, code) # 存储phone:code, 5分钟有效期pl.delete(image_code_uuid) # 从redis中删除这个图片验证码, 以防再次被使用pl.execute()# 6. 返回结果return Response({"code": 0, "msg": "短信发送成功"})
1.3 添加路由
urlpatterns = [path('sms_codes/', views.SmsCodeView.as_view()),
]
2.测试接口
- 接口URL
http://192.168.56.100:8888/user/sms_codes/
- 请求携带参数
{"phone": 18538752511,"image_code":"aed3", # 前端生成的 图形验证码"image_code_uuid":"de8edce2-fc9f-11ea-9325-005056c00008" # 前端生成的uuid
}
django添加检查用户名和手机号数量接口
1.1 在user/urls.py
中添加
urlpatterns = [path('count/', views.RegCountView.as_view()), # 查询用户名手机号使用量的视图, /user/count/
]
1.2 在user/views.py
中添加视图函数
# 查询用户数量接口
class RegCountView(APIView):# 注册时需要验证的用户名和手机号是否使用# 自定义权限类permission_classes = (AllowAny,)def post(self, request):# 接收参数: 验证的内容type: username/phone, data: '用户名' 或者 '手机号',datatype = request.data.get('type')data = request.data.get('data')if not all([data, datatype]):return Response({'code': 999, 'msg': '参数不完整'})if datatype == 'username':count = User.objects.filter(username=data).count()if datatype == 'phone':count = User.objects.filter(phone=data).count()return Response({'code': 0, 'msg': '查询成功', 'data': {'type': datatype, 'count': count}})
测试接口
- 测试接口URL
http://192.168.56.100:8888/user/count/
- 演示结果
完善注册接口
修改user/views.py
中完善视图函数
# 注册接口
class RegisterView(APIView):"""用户注册, 权限是: 匿名用户可访问"""# 自定义权限类permission_classes = (AllowAny,)def post(self, request):"""接收用户名,密码,手机号和验证码, 前端校验两遍一致性, 注册成功后返回成功, 然后用户自行登录获取token1. 用户名2. 密码3. 手机号4. 验证码:param request::return: {'code':0,'msg':'注册成功'}code: "260361"password: "123123"phone: "13303479527"username: "liangxuepeng""""username = request.data.get('username')phone = request.data.get('phone')code = request.data.get('code')passwrod = request.data.get('password')if all([username, passwrod, phone, code]):passelse:return Response({'code': 999, 'msg': '参数不全'})# rand_name = self.randomUsername()# 验证手机验证码redis_client = get_redis_connection('verify_code')code_redis = redis_client.get(phone)if code_redis:code_redis = code_redis.decode()if not code == code_redis:return Response({'code': 999, 'msg': '手机验证码错误'})user = User(username=username, phone=phone)user.set_password(passwrod)user.save()return Response({'code': 0, 'msg': '注册成功'})
Celery实现短信注册接口相关推荐
- 魔方APP项目-06-用户注册,完成短信验证码的校验、基于Celery实现短信异步发送、用户登录,jwt登陆认证、服务端提供用户登录的API接口
一.用户注册- 1.完成短信验证码的校验 application.utils.language.message,代码: class ErrorMessage():ok = "ok" ...
- java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口
防止恶意攻击短信验证码接口方法 1.手机号码限制:限制单个手机号码每天的最大发送次数.超过次数不能发送短信,可以考虑将手机号码加入黑名单,禁止1天. 2.短信发送时间间隔限制:限制同一个手机号码重复发 ...
- 如何防止短信验证码接口、登录注册入口被恶意调用攻击?
目录 前言 1.短信验证码是什么? 2.为什么要对短信验证码进行防护? 3.有哪些常见的防护手段? 4.这些防护手段有没有用呢,到底该如何选择? 5.结语 前言 最近遇到一个关于防止短信验证码被刷的问 ...
- java项目短信群发接口_JAVA实现第三方短信发送过程详解
想使代码生效需要注册: 在muven项目里面导入jar包 commons-codec commons-codec 1.4 commons-httpclient commons-httpclient 3 ...
- 短信验证码接口的应用场景和优势
短信验证码接口是常用于网络平台的一种短信功能接口,它在用户注册登录.密码找回.账户变更.确认支付.活动认证等场景都会应用到,短信接口作为网络平台与用户之间重要交互手段,凭借其速度快.到达率高.安全性好 ...
- mycncart如何开启短信验证接口功能
自mycncart 1.0.2.0开始,开启了短信验证接口功能,并接入了一个默认的短信验证接口 - [广州程宇网络短信验证接口]. 1. 访问设置路径:[网站后台]->[扩展功能]->[短 ...
- IDM短信发送接口设计说明
对于大多数企业而言,信息化建设的主要目的是通过信息化驱动业务,实现业务升级与优化,主要有三种体现形式:建设业务系统,实现业务流程标准化.便捷化:整合业务系统和数据,形成数据资产:业务数据呈现,直观展现 ...
- 短信发送接口(短信宝)
实现:现在的注册一般是通过短信或邮箱两种方式获取验证信息,所有这一篇是短信验证的接口的demo,下一篇我再将邮件验证的demo展示(thinkPHP框架为例): 效果: 步骤: 现在的注册一般是通过短 ...
- 如何防止恶意攻击短信验证码接口
如何防止恶意攻击短信验证码接口 1 自研技术 2 自研验证码被破解怎么办? 3 所有图形验证码都被破解怎么办? 1 自研技术 1.手机号码限制:限制单个手机号码每天的最大发送次数.超过次数不能发送短信 ...
最新文章
- PostgreSQL和Kingbase中设置search_path
- Functional Language
- ABB机器人的错误处理
- textfield获取其中内容_冲压工艺流程,常见冲压缺陷及消除方法,46页内容全面介绍冲压...
- 深度学习----一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)
- 算法:Longest Valid Parentheses(最长有效的括号)
- SQL“多字段模糊匹配关键字查询”
- Vue中 实现 Echarts 图表宽高自适应
- 关于Teigha的使用记录
- BAT文件中如何注释
- 大数据查询与处理Pig培训:大数据查询处理技术解析
- 华硕服务器 bios 内存 1333 显示 800,华硕服务器bios设置
- oracle官网下载过程,Oracle 11g安装步骤
- 洗脑神曲《萨瓦迪卡曼谷》MV里的旅游景点,你都打卡了吗?
- [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
- Occupancy Flow: 4D Reconstruction by Learning Particle Dynamics(2)
- 计算机科学与技术专业教学计划表
- 31-基于单片机的校内小巴士仿真
- 【转】do{...}while(0)的意义和用法
- python3将base64格式的图片保存为MD5值的图片