四. 发送验证码
按照流程,生成验证码后应该是保存验证码,然后发送验证码.这里先不需要考虑保存验证码,因为保存验证码很简单,但是保存验证码后要对比客户提交的验证码,所以这里先考虑发送验证码
然将验证码发送给手机发送验证码首先要有底层发送短信验证码的API接口,还有一些其他的底层业务逻辑.
1. 在libs文件夹中封装一个发短信的接口,新建一个sms .py文件
由于现在没有发短信给手机号的API接口,先用print语句模拟短信验证码的发送(发送对象的手机号,发送验证码的内容)
2. 在user文件夹中新建一个logics .py文件
该文件的作用是把view层的比较繁琐,逻辑比较复杂的函数抽象出来,让view层只做数据验证,数据返回和一些简单的流程控制
在logics .py中定义一个函数,传进来手机号,调用utils模块中的gen_rendom_code函数生成验证码,然后将生成的验证码code和手机号传入到sms中的发送验证码的函数中,发送验证码到手机号
这个就是发送验证码的一个逻辑,当我们还不能实现一个接口,就先把其写成空接口(现在还不能实现libs文件夹中sms模块发送短信的接口,所以先将其写成一个空接口,就模拟其打印出来),先把流程串起来
这里的主流程是:
用户输入手机号 —> 后端从前端的表单数据中获取这个手机号 —> 验证这个手机号是否正确 —> 生成验证码
—> 发送验证码到手机号
这就是给用户发送验证码的逻辑流程
在工作中写代码,一定要做好抽象,做好封装,要学会把代码变成一个独立功能的函数,这个发验证码的功能除了验证手机号,在其他验证中也能重复使用
3. 在api .py文件中调用logics .py中这个函数
现在除了真实发送短信给手机,目前的流程都完成了,重新运行一下程序,通过Postman去测试代码是否有误
返回的code为0,说明没有问题,去pycharm的终端查看,终端就新生成了6位数字的验证码
为了项目的严谨,还可以输入一个错误的手机号,查看相关信息
第三方短信验证码
使用第三方短信接口
测试的时候会使用一些第三方短信接口
官方网址 https://office.ucpaas.com
注册完之后,不需要做很麻烦的事,只需要去创建一个验证码短信的模板即可,也可以在示例模板上更改,但是建议不要修改,因为这个要审核,需要1~3个工作日的时间,示例模版是审核通过的,可以直接使用
接下来去查看SDK
这里没有python的SDK文档下载,因为是一家小公司,但是课可以去查看API接口,选择指定模板单发,查看相关文档
相关参数
查看json请求示例,前3个都是系统自动分配的,
可以去短信的页面查看,就是这些对应的内容
把这些值拿下来,为了安全起见,可能要验证你本人的手机号
还有一些其他要注意的值
templateid,就是模板的id
param是要替换的参数,也就是验证码
文档中也给出了示例(学会看文档是一件很重要的事)
下面是一些返回的示例,也是通过http协议(https)返回json数据,这里只需要着重关注code(或msg),返回成功与否的状态码
还需要关注的是code的返回码表达的含义
接下来了解内容就可以进行测试,往接口发post请求,将相关参数带上
4. 第三方短信验证码测试
现在的这个主流程就已经跑通了,接下来就是第三方短信平台的接入,让第三方平台去讲验证码发送到客户手机
这里测试的时候是发送给自己本人,因为是自己注册的,如果需要发送给别人,需要修改测试号码
这里使用第三方的API接口
测试的时候可以通过ipython先进行测试,查看短信验证码是否能发送成功
然后将param参数(验证码)和mobile参数(手机号)输入进去
然后发送post请求,如果不清楚post请求里的参数都要有哪些,可以通过加上?查看
发送post请求
可以看到,code传回来的参数是000000,代表发送成功
此时,自己的手机中应该收到了一条验证码短信,说明接口能成功,接下来就是用代码去封装
5. 封装代码
将上面的发送验证码的这些代码封装到函数中,抽象出来
像这些和业务相关的配置,可以多次利用的,可以独立放到一个文件中
- 在common文件夹中新建一个config .py文件,用于放置发送验证码的配置
- 在sms .py文件导入发送验证码的配置
现在运行程序,
查看pychram终端打印的内容
验证码发送成功,然而,现在代码还并不完善,如果验证码没有发送成功,应该给前端传输一个数据,让前端告诉用户验证码发送失败,然后才能让用户进行后续操作,所以要进行一个判断,如果cdoe的状态返回的是200,验证码返回的为000000,则发送True给前端,否则给前端返回False,
让前端根据这些去进行操作,反馈信息给用户
这些功能模块都抽象完成,
现在回到api .py文件中,调用这些功能模块,将发送验证码的流程整理清楚:
验证手机格式 --> 生成验证码 --> 发送验证码
6. 事实上这里代码还是不完善的,这里还有个最严重的坑
这个坑就是拿配置数据进行修改,当然,这个坑在验证码这一块没有多大隐患,但是在其他方面,就会产生很大的隐患(比如游戏数据,虽然数据库中的数据不会改变,但显现出来的数据是错误的)
涉及到一个知识点,深拷贝和浅拷贝,这个坑可以作为一个面试中的业务谈论的一个加分项
- d和d1都是json数据
d和d1是同一个对象,占据同一块存储空间,所以,如果对d或者d1进行修改,另外的也会随之改变
- 浅拷贝和深拷贝
现在将d变的复杂一点
d2是浅拷贝,d3是深拷贝
对浅拷贝的d2进行修改,d的第一层数据不会发生改变,但是第二层发生了改变,因为浅拷贝拷贝的时候拷贝的是data的地址,会对data中的数据进行修改
对深拷贝的d3进行修改,d的每一层数据都不会发生改变,因为深拷贝是重新开辟了一个存储空间
填坑
这里代码的修改方法就是浅拷贝,因为这些数据都是一层,浅拷贝不会对原始数据产生影响,如果有层级比较高的,就使用深拷贝
流程已经完全走通了,不需要修改了.但是你的项目经理皱了下眉头,来个需求,开发环境的时候不发送验证码,只有生产环境的时候才去发送验证码,因为你负责的模块完成了,其他开发人员要使用你这个模块,总不能让其他开发人员测试他自己的功能的时候都要短信发一次验证码,这样开发效率会很低
这个功能的实现其实很简单,只需要判断配置文件中是不是开发环境就行了,注意,这个settings是django配置文件中的配置
如果环境是开发环境,那么就只打印验证码,模拟发送验证码这个过程就行了;如果是生产环境,就需要去调用接口去发送验证码