介绍:

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实现短信注册接口相关推荐

  1. 魔方APP项目-06-用户注册,完成短信验证码的校验、基于Celery实现短信异步发送、用户登录,jwt登陆认证、服务端提供用户登录的API接口

    一.用户注册- 1.完成短信验证码的校验 application.utils.language.message,代码: class ErrorMessage():ok = "ok" ...

  2. java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口

    防止恶意攻击短信验证码接口方法 1.手机号码限制:限制单个手机号码每天的最大发送次数.超过次数不能发送短信,可以考虑将手机号码加入黑名单,禁止1天. 2.短信发送时间间隔限制:限制同一个手机号码重复发 ...

  3. 如何防止短信验证码接口、登录注册入口被恶意调用攻击?

    目录 前言 1.短信验证码是什么? 2.为什么要对短信验证码进行防护? 3.有哪些常见的防护手段? 4.这些防护手段有没有用呢,到底该如何选择? 5.结语 前言 最近遇到一个关于防止短信验证码被刷的问 ...

  4. java项目短信群发接口_JAVA实现第三方短信发送过程详解

    想使代码生效需要注册: 在muven项目里面导入jar包 commons-codec commons-codec 1.4 commons-httpclient commons-httpclient 3 ...

  5. 短信验证码接口的应用场景和优势

    短信验证码接口是常用于网络平台的一种短信功能接口,它在用户注册登录.密码找回.账户变更.确认支付.活动认证等场景都会应用到,短信接口作为网络平台与用户之间重要交互手段,凭借其速度快.到达率高.安全性好 ...

  6. mycncart如何开启短信验证接口功能

    自mycncart 1.0.2.0开始,开启了短信验证接口功能,并接入了一个默认的短信验证接口 - [广州程宇网络短信验证接口]. 1. 访问设置路径:[网站后台]->[扩展功能]->[短 ...

  7. IDM短信发送接口设计说明

    对于大多数企业而言,信息化建设的主要目的是通过信息化驱动业务,实现业务升级与优化,主要有三种体现形式:建设业务系统,实现业务流程标准化.便捷化:整合业务系统和数据,形成数据资产:业务数据呈现,直观展现 ...

  8. 短信发送接口(短信宝)

    实现:现在的注册一般是通过短信或邮箱两种方式获取验证信息,所有这一篇是短信验证的接口的demo,下一篇我再将邮件验证的demo展示(thinkPHP框架为例): 效果: 步骤: 现在的注册一般是通过短 ...

  9. 如何防止恶意攻击短信验证码接口

    如何防止恶意攻击短信验证码接口 1 自研技术 2 自研验证码被破解怎么办? 3 所有图形验证码都被破解怎么办? 1 自研技术 1.手机号码限制:限制单个手机号码每天的最大发送次数.超过次数不能发送短信 ...

最新文章

  1. PostgreSQL和Kingbase中设置search_path
  2. Functional Language
  3. ABB机器人的错误处理
  4. textfield获取其中内容_冲压工艺流程,常见冲压缺陷及消除方法,46页内容全面介绍冲压...
  5. 深度学习----一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)
  6. 算法:Longest Valid Parentheses(最长有效的括号)
  7. SQL“多字段模糊匹配关键字查询”
  8. Vue中 实现 Echarts 图表宽高自适应
  9. 关于Teigha的使用记录
  10. BAT文件中如何注释
  11. 大数据查询与处理Pig培训:大数据查询处理技术解析
  12. 华硕服务器 bios 内存 1333 显示 800,华硕服务器bios设置
  13. oracle官网下载过程,Oracle 11g安装步骤
  14. 洗脑神曲《萨瓦迪卡曼谷》MV里的旅游景点,你都打卡了吗?
  15. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
  16. Occupancy Flow: 4D Reconstruction by Learning Particle Dynamics(2)
  17. 计算机科学与技术专业教学计划表
  18. 31-基于单片机的校内小巴士仿真
  19. 【转】do{...}while(0)的意义和用法
  20. python3将base64格式的图片保存为MD5值的图片

热门文章

  1. 2021-04-23 一年后第一次踢球
  2. 【计算1970年到任意一个年月距离有多久】
  3. Excel的Sumif函数
  4. 星瞳科技 OpenMV 的使用
  5. 解决iframe嵌套项目无法登录的问题
  6. 支持向量机检测DGA
  7. python求主析取范式_求公式q→(r∧p)的析取范式。
  8. 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第3部分
  9. python爬app_app爬虫(python app爬虫)
  10. python单曲循环播放MP3