黑马Python教程实战项目--美多商城(三)

一.图形验证码
  先创建一个verifications验证码子应用,并在项目配置文件中注册,在总路由中添加路由。然后在views之中创建图形验证码的视图类,在子路由添加路由。
  在用户访问注册页面时,会向服务器发送一个携带路径参数的GET请求,用来获取图形验证码的图片,携带的这个路径参数是前端生成的用户唯一标识。安装Python的图片处理库Pillow,然后在项目配置文件中配置redis2号库存储验证码数据。使用Pillow中的captcha里面封装的generate_captcha()方法,来获取图形验证码的图片和验证码。然后将验证码保存到redis2号库中,并将用户唯一标识作为key和图形验证码进行绑定,将图片作为响应体响应给页面。
二.短信验证码
  短信验证码是借助了第三方平台容联云通讯发送短信验证码的。首先,我们在容联云官网(https://www.yuntongxun.com/)中注册并登陆,然后进行个人开发者资格认证。接着创建一个应用,如果本地测试的话,应用不需要上线。认证成功之后,在测试号码中添加自己的手机号。
  接着就可以下载一个模板短信SDK,下载地址为:https://www.yuntongxun.com/doc/ready/demo/1_4_1_2.html,SDK中包含两个文件,CCPRestSDK.py:这是由容联云通讯开发者编写的官方SDK文件,里面写有发送模板短信的方法;
ccp_sms.py:这里面是调用发送模板短信的方法。我们需要将ccp_sms.py文件中的_accountSid、_accountToken、_appId等换成自己账号中的数据。然后使用sendTemplateSMS方法发送短信验证码,这个方法要传入三个参数,第一个参数是目标手机号。第二个参数是一个列表,列表中第一个数据是短信验证码,第二个数据是有效时间。第三个参数是模板编号(注:如果是本地测试,模板使用测试模板,编号1)。
  为了优化性能,我们将发送短信验证码的方法封装在一个单例类中。
  在用户点击发送验证码时,会向服务器发送一个get方式的ajax请求,新建一个短信验证码的视图类并在子路由中添加路由。前端发请求时,总共有三个参数,一个路径参数手机号,两个查询字符串参数用户写入的图形验证码以及用户唯一标识。接受参数之后,要将参数进行校验。然后通过前端传过来的用户唯一标识,从redis2号库中提取之前保存的图形验证码,提取出来之后要将redis数据库中保存的数据删除。然后将redis数据库中的验证码和用户写入的图形验证码进行对比,如果不同,则响应错误信息。对比无误使用随机数模块random生成一个六位数的短信验证码,将短信验证码保存到redis2号库中,并将手机号作为key与短信验证码进行绑定。然后调用单例类中的发送短信的方法,发送短信验证码。
  在注册视图中,保存用户信息之前,补充短信验证码的验证。根据用户写入的手机号,从redis数据库中获取到之前保存的短信验证码,然后与用户写入的短信验证码进行对比,如果对比不通过,则返回错误信息。比对通过再保存注册信息。
  为了避免恶意用户频繁发送短信验证码,在将短信验证码保存到redis数据库中时,同时写入一个带有有效期的flag。在对比过图形验证码之后,查询redis数据库中是否存在flag,如果存在则直接响应发送短信过于频繁,不存在,再生成、保存、发送短信验证码。
三.异步方案
  由于发送短信验证码存在网络延迟,会影响到响应,所以我们要异步发送短信,将响应和发送短信验证码分开执行,对此我们借助了生产者消费者模式的celery。
  首先安装Celery模块,然后定义Celery包,在Celery包中创建main.py文件和config.py文件。在main.py文件中创建celery实例,并加载config.py文件。在config.py文件中需要指定消息队列存放的位置,我们选择在redis10号库。然后在Celery包中创建任务包,在任务包中创建tasks.py文件,在tasks.py文件中定义我们要异步执行的任务方法,并使用celery_app.task()作为装饰器。然后要在main文件中注册任务。
  在发送短信验证码视图中,将发送短信验证码的方法换成异步任务,再在终端中开启Celery服务,就可以执行异步任务了。
短信验证码

成功开启Celery服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值