Django电商网站--短信验证码
首页 专栏 python 文章详情
0

Django电商网站--短信验证码

王伟路 发布于 2 月 24 日

为了防止恶意注册,需要在网站注册中引入短信验证码的功能,总体流程如下

此外,为了优化该过程,需要将SDK中发送短信的方法修改为单例类模式,防止高并发时占用大量内存,示例代码如下

class CCP(object):
    \_\_instance = Fales
    def \_\_new\_\_(cls, *args, **kwargs):
        if not \_instance:
            cls.\_instance = super(CCP,cls).\_\_new\_\_(cls, *args, **kwargs)
            cls.\_instance.rest = REST(\_serverIP, \_serverPort, \_softVersion)
            cls.\_instance.rest.setAccount(\_accountSid, \_accountToken)
            cls.\_instance.rest.setAppId(\_appId)
            return cls.\_instance

def send_template_sms(self,to, datas, tempId):
    result = self.rest.sendTemplateSMS(to, datas, tempId)
    print(result)
    if result.get('statusCode') == '000000':
        return 0
    else:
        return -1

此外,为了防止发短信的任务的延迟导致阻塞页面响应的情况的发生,
我们引入celery负责发送短信功能 作为异步方案,celery是一个简单灵活可靠的可处理大量消息的分布式系统,可以在一台或多台机器上运行,单个celery进程每分钟可处理数以百万计的任务。比python中原有的threading模块性能至少高出十万倍,使用户点击发送短信后 页面响应结果同发送短信并行进行,保证主线注册程序的顺利执行 避免发生阻塞。celery采用的是生产者消费者设计模式。生产者:负责产生任务的,即发送短信。消息队列(broker):负责承载任务的。消费者:负责执行任务的。在此项目中 生产者是美多商城,消费者是celery。中间人:消息/任务队列,任务/消息:发送短信。打个比方就是 生产者相当于厨师,盘子相当于中间人/消息队列,大厨做出来的菜品相当于信息队列中的信息,食客相当于消费者。
为了避免恶意用户频繁请求发送短信,需要设置一个send\_flag 变量,初始值为False 类比厕所的门是开着的,当发送短信之后 send\_flag变为True,存进Redis 类比为有人进入厕所了,厕所门关闭,当短信过期之后send\_flag 变量重新变为false 厕所门又开了,  收到发送短信请求的时候,后端先提取send\_flag,校验是否为True,如果是的话,说明厕所门还是关着的,提示用户短信发送过于频繁。

python django
阅读 45 更新于 2 月 25 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar
王伟路
1 声望
0 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
王伟路
1 声望
0 粉丝
关注作者
宣传栏
目录

为了防止恶意注册,需要在网站注册中引入短信验证码的功能,总体流程如下

此外,为了优化该过程,需要将SDK中发送短信的方法修改为单例类模式,防止高并发时占用大量内存,示例代码如下

class CCP(object):
    \_\_instance = Fales
    def \_\_new\_\_(cls, *args, **kwargs):
        if not \_instance:
            cls.\_instance = super(CCP,cls).\_\_new\_\_(cls, *args, **kwargs)
            cls.\_instance.rest = REST(\_serverIP, \_serverPort, \_softVersion)
            cls.\_instance.rest.setAccount(\_accountSid, \_accountToken)
            cls.\_instance.rest.setAppId(\_appId)
            return cls.\_instance

def send_template_sms(self,to, datas, tempId):
    result = self.rest.sendTemplateSMS(to, datas, tempId)
    print(result)
    if result.get('statusCode') == '000000':
        return 0
    else:
        return -1

此外,为了防止发短信的任务的延迟导致阻塞页面响应的情况的发生,
我们引入celery负责发送短信功能 作为异步方案,celery是一个简单灵活可靠的可处理大量消息的分布式系统,可以在一台或多台机器上运行,单个celery进程每分钟可处理数以百万计的任务。比python中原有的threading模块性能至少高出十万倍,使用户点击发送短信后 页面响应结果同发送短信并行进行,保证主线注册程序的顺利执行 避免发生阻塞。celery采用的是生产者消费者设计模式。生产者:负责产生任务的,即发送短信。消息队列(broker):负责承载任务的。消费者:负责执行任务的。在此项目中 生产者是美多商城,消费者是celery。中间人:消息/任务队列,任务/消息:发送短信。打个比方就是 生产者相当于厨师,盘子相当于中间人/消息队列,大厨做出来的菜品相当于信息队列中的信息,食客相当于消费者。
为了避免恶意用户频繁请求发送短信,需要设置一个send\_flag 变量,初始值为False 类比厕所的门是开着的,当发送短信之后 send\_flag变为True,存进Redis 类比为有人进入厕所了,厕所门关闭,当短信过期之后send\_flag 变量重新变为false 厕所门又开了,  收到发送短信请求的时候,后端先提取send\_flag,校验是否为True,如果是的话,说明厕所门还是关着的,提示用户短信发送过于频繁。