【测试开发技能】Django中验证码的实现
- 2020 年 1 月 20 日
- 筆記
前言
我们在做UI自动化的时候,验证码的识别绝对是让人比较头痛的问题之一,因为涉及到图像处理,模式识别等领域方面的知识,所以到目前为止也没有一个可以打包票说可以百分之百识别验证码的解决方案。本篇不会去教大家采取哪种方式去识别验证码,而是给大家介绍一下在django中怎么实现验证码这个功能的。
背景
在实际应用中,很多业务场景如 登录,注册,发送短信验证码 等需要大家输入验证码,其主要目的是强制人机交互来抵御自动化攻击。本篇以注册功能为例,讲解django中是如何实现验证码功能的。
步骤
- 安装第三方 django-simple-captcha 包
pip isntall django-simple-captcha==0.4.6
- 在settings.py 文件中的 INSTALLED_APPS 中添加该app

- 同步数据库 利用
makemigrations
和migrate
同步数据库,同步完成后,数据库中增加captcha_captchastore
这张表 - 在
forms.py
文件中添加验证码字段forms.py
文件是对post请求所提交的表单数据做预处理(判断,可以减轻views.py
中的工作量),我们的注册页面除了验证码之外,还有邮箱和密码两个字段,代码如下:

- 在
views.py
文件中的实现 注意在get
方法中,我们要将上一步的form表单实例化,传递给前端html 文件 ,看具体的代码实现:

- 在前端html页面中验证码块做如下修改

验证码判断实现原理
经过上面6步操作,我们就可以实现了注册页面时的验证码功能,我们运行程序,在注册页面,验证码块检查页面元素,会发现如下的html代码
<input id="id_captcha_0" name="captcha_0" type="hidden" value="2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011">
这表明在注册 form 表单中还有个type=hidden
的input 元素,会随着post请求一起发送到服务器端,我们再看captcha_captchastore
这张表,其中 有条记录的 hashkey 的值等于 隐藏域的value :2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011 ,且对应的 response 字段恰好就是页面上显示验证码的值。 这下我们就明白了其判断逻辑是如何实现的: 我们提交注册页面表单的同时除了提交邮邮箱,密码,验证码,之外,还会有一个隐藏域,他作为 hashkey 会到 captcha_captchastore 这表中去查找对应的验证码,如果和我们传入的验证码一样,则验证通过,反之,和验证失败。
好了,django中如何实现验证码功能就介绍到这里,有兴趣的同学可以实践下!代码是截图,如需要复制,可联系微信号cctester
一键关注微信公众号,获取更多资讯