图片验证码的生成

1.django 缓存设置

1.1 安装Django缓存模块

pip install django-redis==4.12.1

1.2 syl/settings.py中配置缓存

# syl/settings.py ## 图形验证码,存redis    0号库
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/0","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}},# 图形验证码   存redis 2号库"img_code": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}},
}

2.新建应用verifications

  • 图形验证码

  • 短信验证码

  • 邮件验证

'''2.1 在apps文件夹下新建应用: verifications'''
python ../manage.py startapp verifications   # 切换到apps文件夹下执行创建命令'''2.2 在syl/settings.py中添加应用'''
INSTALLED_APPS = ['verificationsapp',
]'''2.3 在syl/urls.py主路由中添加'''
path('verify/', include('verifications.urls')),'''2.4 添加子路由: verifications/urls.py'''
from django.urls import path
from . import views
urlpatterns = [# path('image_codes/', views.ImageCodeView.as_view()),path('sms_codes/', SendSMSCode.as_view())
]

3.图形验证码captcha使用

1.下载captcha压缩包captcha.zip,放到项目packages文件夹下
2.解压captcha.zip放到syl/libs文件夹下
3.解压文件中的syl/libs/captcha/captcha.py 右键运行即可生成图片验证码
unzip xxx.zip

4.在verifications/views.py中使用

# verifications/views.py #from django.http import HttpResponse
from libs.captcha.captcha import captcha
class ImageCodeView(APIView):def get(self, reqeust):# 1、获取uuid数据uuid = reqeust.query_params.get('uuid')# 2、校验数据# 判断uuid是否存在if not uuid:return Response({"code": 4005, 'msg': '参数不完整'})# 3.处理业务# 调用captche包生成图片text, image = captcha.generate_captcha()# 4.把uuid和图片文本存入redis# 把对应的图片存到redis里边redis_client = get_redis_connection('img_code')# 5.写入redis(是字符串)redis_client.setex(uuid, 60 * 60, text)# 6.返回响应图片# 指明返回数据的类型return HttpResponse(image, content_type='image/jpg')

5.测试验证码接口

阿里云短信服务的使用

申请短信服务,领取免费短信,申请签名和模板

手机验证码思路:

  • 封装发短信代码   # utils/MyBaseView.py #
import jsonfrom aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from syl.settings import ALY_ACCESSKEY_SECRET, ALY_ACCESSKEY_ID# phone = ""
# phone_code = ""
# data = {"code": phone_code}def send_sms(phone, data):# accessKeyId# accessSecret# cn-hangzhouclient = AcsClient('<ALY_ACCESSKEY_SECRET>', '<ALY_ACCESSKEY_ID>', '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 | httprequest.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_185212884")request.add_query_param('TemplateParam', data)response1 = client.do_action(request)# python2:  print(response)res=json.loads(str(response1, encoding='utf-8'))

在setting.py中配置 ID和 SECRET

  • #在setting.py中配置
#在setting.py中配置# 阿里云短信验证码
ALY_ACCESSKEY_ID = "LTAI4Fci9EX1YfowAARw8ekc"
ALY_ACCESSKEY_SECRET = 'ipIhfM6aqcDMcSr9VUMqhUNpzjVCvo'

测试短信功能接口

  • # 在verificationsapp中配置 TestSendPhone 测试接口 #
# 在verificationsapp中配置 TestSendPhone接口 #class TestSendPhone(APIView):def get(self, request):phone = request.query_params.get('phone')number = random.randint(100000, 999999)data = {'code': number}send_sms(phone, data)return Response({'code': 200})
  • 短信发送和验证的逻辑
  • # verificationsapp/view.py 发送接口 #
#verificationsapp/VIEW.PYclass 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")print('=====================', phone, image_code_uuid, image_code)# 验证数据if not all([phone, image_code, image_code_uuid]):return Response({"code": 4005, "msg": "参数不全"})# 逻辑与入库# 3、验证图片验证码是否正确# 3.1连接redisredis_cli = get_redis_connection("img_code")# 3.2拿着uuid获取图片验证码redis_img_code = redis_cli.get(image_code_uuid).decode('utf-8')# 3.3比对redis里的code和发来的code是否一致if image_code.lower() != redis_img_code.lower():return Response({"code": 4009, "msg": "图片验证码错误"})# 4、使用阿里云发送短信# 4.1准备手机验证码number = random.randint(100000, 999999)data = {"code": number}print(data)# 4.2使用封装好的接口发送短信send_sms(phone, data)# 5.将短信验证码绑定并存入redisredis_cli.setex(phone, 60 * 60, number)# 6.删除image_coderedis_cli.delete(image_code_uuid)return Response({"code": 0, "msg": "发送成功"})

在# userapp/CheckUserInfoNew 查询接口 #

# userapp/CheckUserInfoNew 接口 #

# userapp/CheckUserInfoNew 接口 #class CheckUserInfoNew(APIView):def post(self, request):# 获取数据type = request.data.get('type')data = request.data.get('data')# 数据验证if not all([type, data]):return Response({'code': 4009, 'msg': '参数不完整'})# 逻辑与入库if type == 'username':count = models.User.objects.filter(username=data).count()elif type == 'phone':count = models.User.objects.filter(phone=data).count()else:return Response({'code': 4005, 'msg': '参数传递错误'})# 返回return Response({'code': 0, 'msg': '查询成功', 'data': {'type': type, "count": count}})
<template><a-form :form="form" @submit="handleSubmit"><a-form-item v-bind="formItemLayout"><span slot="label">用户名:&nbsp;<a-tooltip title="What do you want others to call you?"><a-icon type="question-circle-o" /></a-tooltip></span><a-input v-model="username"/></a-form-item><a-form-item v-bind="formItemLayout" label="密码" has-feedback><a-input v-model="password"/></a-form-item><a-form-item v-bind="formItemLayout" label="邮箱"><a-input v-model="email"/></a-form-item><a-form-model-item v-bind="formItemLayout" label="手机号"><a-input v-model="phone"></a-input></a-form-model-item><a-form-model-item v-bind="formItemLayout" label="验证码"><a-input v-model='imgCode'></a-input></a-form-model-item><a-form-itemv-bind="formItemLayout"label="手机验证码"><a-row :gutter="8"><a-col :span="12"><a-inputv-model="code"/></a-col><imgclass="verify-code":src="imgUrl"@click="getImgUrl"><a-col :span="12"><a-button @click="sendcode">获取验证码</a-button></a-col></a-row></a-form-item><a-form-item v-bind="tailFormItemLayout"></a-form-item><a-form-item v-bind="tailFormItemLayout"><a-button type="primary" html-type="submit" @click="btn">注册</a-button></a-form-item></a-form>
</template><script>
const residences = [{value: 'zhejiang',label: 'Zhejiang',children: [{value: 'hangzhou',label: 'Hangzhou',children: [{value: 'xihu',label: 'West Lake',},],},],},{value: 'jiangsu',label: 'Jiangsu',children: [{value: 'nanjing',label: 'Nanjing',children: [{value: 'zhonghuamen',label: 'Zhong Hua Men',},],},],},
];
import axios from 'axios'
export default {data() {return {code:'',imgCode:'',username:'',phone:'',password:'',email:'',imgUrl:'',confirmDirty: false,residences,autoCompleteResult: [],formItemLayout: {labelCol: {xs: { span: 24 },sm: { span: 8 },},wrapperCol: {xs: { span: 24 },sm: { span: 8 },},},tailFormItemLayout: {wrapperCol: {xs: {span: 24,offset: 0,},sm: {span: 16,offset: 8,},},},};},mounted() {},beforeCreate() {this.form = this.$form.createForm(this, { name: 'register' });},methods: {btn(){axios.post('http://127.0.0.1:8000/user/register/',{'username':this.username,'password':this.password,'phone':this.phone,'code':this.code}).then(res=>{alert(res.data.msg)if(res.data.code==200){this.$router.push('/')}else{}})},sendcode() {this.is_send = trueconsole.log("开始发送短信")axios.post('http://127.0.0.1:8000/verify/sms_codes/',{'phone':this.phone,'image_code_uuid':this.uuid,'image_code':this.imgCode}).then((res) => {console.log(res.data.msg)})},handleSubmit(e) {e.preventDefault();this.form.validateFieldsAndScroll((err, values) => {if (!err) {console.log('Received values of form: ', values);}});},handleConfirmBlur(e) {const value = e.target.value;this.confirmDirty = this.confirmDirty || !!value;},compareToFirstPassword(rule, value, callback) {const form = this.form;if (value && value !== form.getFieldValue('password')) {callback('Two passwords that you enter is inconsistent!');} else {callback();}},validateToNextPassword(rule, value, callback) {const form = this.form;if (value && this.confirmDirty) {form.validateFields(['confirm'], { force: true });}callback();},handleWebsiteChange(value) {let autoCompleteResult;if (!value) {autoCompleteResult = [];} else {autoCompleteResult = ['.com', '.org', '.net'].map(domain => `${value}${domain}`);}this.autoCompleteResult = autoCompleteResult;},getUuid() {var d = new Date().getTime()if (window.performance && typeof window.performance.now === 'function') {d += performance.now()}var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {var r = (d + Math.random() * 16) % 16 | 0d = Math.floor(d / 16)return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16)})return uuid},getImgUrl() {let uuid = this.getUuid()console.log(uuid)this.uuid = uuidlet url = 'http://127.0.0.1:8000/verify/image_codes/?uuid=' + uuidconsole.log(url)// let url = 'http://192.168.56.100:8888/verify/image_codes/?uuid=66ea64aa-fbe6-11ea-a3d3-005056c00008'this.imgUrl = url},},created() {this.getImgUrl()},
};
</script>

图片验证码、阿里云短信发送和验证的逻辑相关推荐

  1. 阿里云短信发送接口直接HTTP请求调用

    最新一个个性化项目,客户要求使用阿里云短信发送接口. 但是实在不想引入阿里云的SDK,就自己生成签名,拼接URL实现,  其实用他们的SDK最终也是一哥GET请求进行调用,归根接底还是HTTP请求. ...

  2. PHP 实现 阿里云 短信发送 功能步骤

    1.创建签名 (记住签名名称,后面代码配置中需要),2小时以内会审核通过. 2.创建模板 (记住模板CODE ,后面代码配置中需要) 3. 生成AccessKey ID 和 Access Key Se ...

  3. Java阿里云短信发送工具类

    短信服务API介绍 阿里云短信发送:调用SendSms发送短信_短信服务-阿里云帮助中心 <!--springboot项目阿里云发送短信--> <dependency>< ...

  4. PHP阿里云短信发送文件(带签名)

    <?php namespace app\admin\controller;/*** 阿里云短信发送接口*/ class Alisms {public $accesskeyid = "& ...

  5. PHP 之阿里云短信发送

    一.阿里云短信发送函数封装 function aliyun_sms($mobile,$id,$data){// 引入阿里云短信类require_once $_SERVER['DOCUMENT_ROOT ...

  6. jeecg 手机注册 阿里云短信API 【 阿里云短信发送验证码 平台配置和项目中使用】

    文章目录 jeecg 项目效果展示 短息通知页面入口 代码中调用短信api 配置和代码 API中的重要参数配置项: 阿里控制台注册 注册签名 注册短信模板  阿里云短信发送验证码配置和项目使用 je ...

  7. 阿里云短信发送验证码使用记录

    官网:https://www.aliyun.com/product/sms 0.首先需要注册阿里云账号,可以直接用支付宝登陆. 1.登陆阿里云短信管理控制台,选择快速学习,使用测试短信发送 2.测试手 ...

  8. 阿里云短信发送触发天级流量及解决办法

    前言 今天小项目里引入了阿里云短信.调试过程中,突然不发短信了.发现接口返回信息,触发天级流量限制.以下是原因和解决办法. 原因 短信发送有默认的频率限制 限制如下: 短信验证码 :使用同一个签名,对 ...

  9. Java实现短信验证码(阿里云短信服务)

    前言: 很多时候我们做的项目都需要上图这样的验证码来帮助我们完成更好的功能,比如:什么登录注册,忘记密码需要发送手机验证码之类的啊...下面分享我今天通过阿里云短信服务实现的短信验证码,操作都很简单, ...

最新文章

  1. 树莓派python实例_树莓派3 搭建 django 服务器的实例
  2. .NET 正则表达式’$’符号的使用
  3. 10、Java Swing JComboBox:下拉列表组件
  4. python 将数组转化8位整数_int对象,永不溢出的整数
  5. 使用记事本写java程序并编译运行过程
  6. IC设计常用文件及格式介绍
  7. mac composer 安装
  8. springboot实现web文件上传,下载demo(附带demo链接)
  9. 【金蝶】金蝶KIS专业版9.1清理用户名密码
  10. X1Tablet键盘改造成USB键盘
  11. 华为设备接口视图_华为设备的交换机接口类型介绍及配置
  12. DELL服务器 R740的风扇设置
  13. (转)任正非对新员工的寄语:烧不死的就是凤凰
  14. REST Assured 2 - 用IDEA创建一个基本的REST Assured Maven项目
  15. Java 13个语法糖梳理总结
  16. GRUB4DOS详解
  17. Excel基础(02)单元格格式
  18. Jetson nano GPIO的使用
  19. java跳骚市场的代码,Java常用API包及骚操作
  20. 日常常用英文单词整理

热门文章

  1. 类似火车头的采集器-免费任意数据采集器
  2. ANDROID StrictMode 使用
  3. 电信增值业务学习笔记(转)
  4. 解决surface的幽灵触控
  5. MySQL的while循环
  6. c语言之getchar函数输入字符
  7. Cufflinks的使用
  8. m3u8 视频提取工具(下载web中的ts文件)
  9. Linux通过stty命令操作串口设备(linux串口操作命令)
  10. Android 仿钉钉、微信 群聊组合头像,Android插件化入门指南