图片验证码,验证码异步celery

01.用户模块

注册页面、登录页面

 

1.获取手机验证码

1.简要描述:

获取手机验证码

2.请求URL:

http://192.168.56.100:8888/verify/sms_codes/

3.请求方式:POST

4.参数:访问接口携带参数

4.1请求接口事例

{

    "phone":"phone",

"image_code":”a86d,

"image_code_uuid":”de8edce2-fc9f-11ea-9325-005056c00008,

}

请求接口参数说明:

参数名

必选

类型

说明

phone

string

手机号

image_code

string

字符串的验证码

image_code_uuid

string

前端生成的uuid

 

4.2 返回事例

 

{

"code":0,

 "msg":"短信发送成功",

    "data":{

       

    }

}


返回参数说明

参数名

类型

说明

code

string

状态码

msg

string

提示信息

 

 

 

1.1.4 注册接口

1.简要描述:

用户注册接口

2.请求URL:

http://192.168.56.100:8888/user/register/

3.请求方式:POST

4.参数:访问接口携带参数

4.1请求接口事例

{

    "username":"zhangsan",

"password":”zs@qq.com,

"phone":”18538752511,

"code":”786543

}

请求接口参数说明:

参数名

必选

类型

说明

username

string

用户名

password

string

密码

phone

string

用户手机号

code

string

短信验证码

 

4.2 返回事例

{

    "code":0,

    "msg":"注册成功",

    "data":{

 

    }

}


返回参数说明

参数名

类型

说明

code

string

状态码

msg

string

提示信息

 

 

1.1 celery应⽤举例

Celery 是⼀个 基于 python 开发的 分布式异步消息任务队列 ,通过它可以轻松的实现任务的异步处
理,如果你的业务场景中需要⽤到异步任务,就可以考虑使⽤ celery
你想对 100 台机器执⾏⼀条批量命令,可能会花很⻓时间 ,但你不想让你的程序等着结果返回,⽽
是给你返回 ⼀个任务 ID, 你过⼀段时间只需要拿着这个任务 id 就可以拿到任务执⾏结果, 在任务执
ing 进⾏时,你可以继续做其它的事情
Celery 在执⾏任务时需要通过⼀个消息中间件来接收和发送任务消息,以及存储任务结果, ⼀般
使⽤ rabbitMQ or Redis
 
 

 

1 Celery有以下优点

简单:⼀单熟悉了 celery 的⼯作流程后,配置和使⽤还是⽐较简单的
⾼可⽤:当任务执⾏失败或执⾏过程中发⽣连接中断, celery 会⾃动尝试重新执⾏任务
快速:⼀个单进程的 celery 每分钟可处理上百万个任务
灵活: ⼏乎 celery 的各个组件都可以被扩展及⾃定制

2.Celery 特性

⽅便查看定时任务的执⾏情况 , 如 是否成功 , 当前状态 , 执⾏任务花费的时间等 .
可选 多进程 , Eventlet Gevent 三种模型并发执⾏ .
Celery 是语⾔⽆关的 . 它提供了 python 等常⻅语⾔的接⼝⽀持 .

3.celery 组件

Celery 扮演⽣产者和消费者的⻆⾊
Celery Beat : 任务调度器 . Beat 进程会读取配置⽂件的内容 , 周期性的将配置中到期需要执⾏的任
务发送给任务队列 .
Celery Worker : 执⾏任务的消费者 , 通常会在多台服务器运⾏多个消费者 , 提⾼运⾏效率 .
Broker : 消息代理 , 队列本身 . 也称为消息中间件 . 接受任务⽣产者发送过来的任务消息 , 存进队列
再按序分发给任务消费⽅ ( 通常是消息队列或者数据库 ).
Producer : 任务⽣产者 . 调⽤ Celery API , 函数或者装饰器 , ⽽产⽣任务并交给任务队列处理的都
是任务⽣产者 .
Result Backend : 任务处理完成之后保存状态信息和结果 , 以供查询

2.3 产⽣任务的⽅式

发布者发布任务 (WEB 应⽤ )
任务调度按期发布任务 ( 定时任务 )

2.4 celery 依赖三个库: 这三个库, 都由 Celery 的开发者开发和维

.
billiard : 基于 Python2.7 multisuprocessing ⽽改进的库 , 主要⽤来提⾼性能和稳定性 .
librabbitmp : C 语⾔实现的 Python 客户端
kombu : Celery ⾃带的⽤来收发消息的库 , 提供了符合 Python 语⾔习惯的 , 使⽤ AMQP 协议的⾼
级借⼝ .

2celery的使⽤

推荐版本  
   Django == 2.2.6
   django-celery == 3.3.1
   django-redis == 4.11.0
   redis == 2.10.6
   celery == 3.1.26.post2
Settings.py #settings.py
import djcelery
djcelery . setup_loader ()
BROKER_URL = 'redis://127.0.0.1:6379/2'
INSTALLED_APPS = [
...
"djcelery" ,
...
]
创建 celery 所需要的表
python manage . py migrate
# 如若不成功可以尝试⼀下命令语句
#python manage.py syncdb
创建 task
  在 app ⾥建⽴ tasks.py ⽂件来写⼊需要执⾏的异步任务
###############verificationsapp/tasks.py########
import django

django.setup()
import json
import time

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from celery.task import task


@task
def send_sms(phone, data):
    # !/usr/bin/env python
    # coding=utf-8
    client = AcsClient('LTAI4G2KfZkQNTLPYDx58Lam', 'SczbAWehzwuctgtHqNiJtHm67WW9im', 'cn-hangzhou')(获取阿里云的)

    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain('dysmsapi.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https')  # https | http
    request.set_version('2017-05-25')
    request.set_action_name('SendSms')

    request.add_query_param('RegionId', "cn-hangzhou")
    request.add_query_param('PhoneNumbers', phone)
    request.add_query_param('SignName', "金氏商城")
    request.add_query_param('TemplateCode', "SMS_205887818")
    request.add_query_param('TemplateParam', data)

    response = client.do_action(request)
    # python2:  print(response)
    res = json.loads(str(response, encoding='utf-8'))
    time.sleep(5)
    return 5 + 10
a 、当 settings.py 中的 djcelery.setup_loader() 运⾏时 , Celery 便会查看所有 INSTALLED_APPS app
⽬录中的 tasks.py ⽂件 , 找到标记为 task function, 并将它们注册为 celery task.
   b 、在执⾏ djcelery.setup_loader() , task 是以 INSTALLED_APPS 中的 app ,
.tasks.function_name 注册的
   c 、⼀次需要注意 在 impprt task , 需要保持⼀致
   d 、如果我们由于 python path 不同⽽使⽤不同的引⽤⽅式时 ( 例如在 tasks.py 中使⽤ from
myproject.myapp.tasks import add 形式 ), Celery 将⽆法得知这是同⼀ task, 因此可能会引起奇怪的
bug
views.py ⾥让任务异步执⾏
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http.response import HttpResponse
import random
from utils.MyBaseView import send_sms
class SendSMSCode(APIView):
    def post(self, request):
        phone = request.data.get("phone")
        image_code = request.data.get("image_code")
        image_code_uuid = request.data.get("image_code_uuid")

        if not all([phone, image_code, image_code_uuid]):
            return Response({"code": 4005, "msg": "参数不全"})

        # 先获取redis 里的图片验证码来比对

        redis_cli = get_redis_connection("img_code")
        redis_img_code = redis_cli.get(image_code_uuid).decode()

        if image_code.lower() != redis_img_code.lower():
            return Response({"code": 4003, "msg": "参数错误"})

        # 发送短信

        num = random.randint(100000, 999999)
        send_data = {"code": num}
        send_sms(phone, send_data)

        # 删除redis里的image_code,保存phone_code
        pl = redis_cli.pipeline()
        pl.setex(phone, 60 * 5, num)
        pl.delete(image_code_uuid)
        pl.execute()

        return Response({"code": 0, "msg": "发送成功"})
启动 celery
  ⾸先正常启动你的 django 任务,然后启动 celery 服务即可。
python manage.py celery worker --loglevel=info
 如果报错不让超级管理员来启动,在 settings.py 加⼊以下配置
from celery import Celery , platforms
platforms . C_FORCE_ROOT =true

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值