云片网发送短信验证码(API)
URL = "https://sms.yunpian.com/v2/sms/single_send.json"
apikey = "9b11127a9701975c734b8aee81ee3526" # 9bddae557939db620e2080b2db52ade8
mobile = "15205201314"
text:【云片网】您的验证码是 1234 # 【XXX】您的验证码是#code#。如非本人操作,请忽略本短信
import requests
def send_single_sms(apikey,code,mobile):
url = "https://sms.yunpian.com/v2/sms/single_send.json"
text = '【云片网】您的验证码是'.format(code)
res = requests.post(url,data = {
'apikey':apikey,
'mobile':mobile,
'text':text
})
result = res.json()
return result
if__name__= '__main__':
send_single_sms(apikey,'1234',mobile)
Django 验证码
pip install django-simple-captcha
# setting
captcha # 添加到INSTALLED_APPS中
# 执行
python manage.py migrate
# 路由路径中添加(urls)
# 正则表达式 re_path
re_path(r'^captcha/',include('captcha.urls'))
#apps.users.forms
from captcha.fields import CaptchaField
class DynamicLoginForm(forms.Form):
captcha = CaptchaField()
# views 中
class LoginView(View):
def get(self,request):
# 判断用户是否已经登陆
if request.user.is_authenticated:
return redirect(reverse('front:index'))
# 对未登录的从DynamicLoginForm 中取验证码,并跟着下发下去
login_form = DynamicLoginForm()
return render(request,"login.html",{'login_form':login_form})
动态登陆原理
from django.conf import settings
from django.http import HttpResponse,JsonResponse
from apps.utils.YunPian import send_single_sms # 发送短信函数
from apps.utils.random_str import generate_random # code生成文件
class SendSmsView(View):
# 接收客户端发送过来的请求验证码的信息
def post(self,request):
send_sms_form = DynamicLoginForm(request.POST) # 对动态发送上来的数据进行验证
re_dict = {}
if send_sms_form.is_valid():
mobile = send_sms_form.clearned_data.get("mobile") # 获取手机号
code = generate_random(4,0) # 生成随机code
sms_json = send_single_sms(settings.YP_APIKEY,code,mobile) # 接收短信接口返回的数据
if sms_json['code'] == 0:
# 设置redis数据库 连接、插入数据
r = redis.Redis(host=settings.REDIS_HOST,port=settings.REDIS_PORT
,db=0,charset="utf-8",decode_responses=True)
r.set(mobile,code)
# 设置redis数据库过期时间
r.expire(mobile,60*5)
re_dict['status'] = 'success'
else:
re_dict['msg'] = sms_json['msg']
else:
print(send_sms_form.errors.get_json_data())
for key,value in send_sms_form.errors.items():
re_dict[key] = value[0]
return JsonResponse(re_dict)
**#redis 使用方法**
import redis
# redis 默认数据库的个数 16个
r = redis.Redis(host='127.0.0.1', port=6379, db=0, encoding='utf8', decode_responses=True)
r.set('name','juran')
r.expire('name',1)
import time
time.sleep(1)
# b'juran' 字节
print(r.get('name'))
**# 动态登陆方法**
class DynamicLoginView(View):
def post(self,request):
dynamic_login = False
login_form = DynamicLoginPostForm(request.POST) # 根据手机号验证code是否正确
d_form = DynamicLoginForm(request.POST)
if login_form.is_valid():
mobile = login_form.cleaned_data.get('mobile')
existed_user = UserProfile.objects.filter(mobile = mobile)
if existed_user:
user = existed_user[0]
else:
user = UserProfile(username=mobile)
password = generate_random(10,2)
user.set_password(password)
user.mobile = mobile
user.save()
login(request, user)
return redirect(reverse('front:index'))
else:
print(login_form.errors.get_json_data())
dynamic_login = True
content = {
'login_form': login_form,
'forms_errors': login_form.errors,
'd_form': d_form,
'dynamic_login': dynamic_login
}
return render(request, 'login.html', context=content)
用户注册
# user.forms中 设置验证码- 在views进行返回前端
class RegisterGetForm(forms.Form)
captcha = CaptchaField()
# user.forms 中对提交上来的注册信息进行验证(手机号+验证码+密码)
class RegisterPostForm(forms.Form):
mobile = forms.CharField(max_length=11,min_length=11,required=True)
code = forms.CharField(min_length=4, max_length=4,required=True)
password = forms.CharField(required=True)
# 获取手机号,到数据库中去查看下是否存在,如果存在提示 号码已经存在
def clean_mobile(self):
mobile = self.cleaned_data.get('mobile')
mobile_exists = UserProfile.objects.filter(mobile=mobile)
# 根据验证是否存在做判断
if mobile_exists:
raise forms.ValidationError('手机号码已经存在')
return mobile
# 提取手机号、验证码、链接redis、获取redis中mobile对应code,如果code没问题、则返回、有问题则告知验证码不正确
def clean(self):
mobile = self.cleaned_data.get('mobile')
code = self.cleaned_data.get('code')
r = redis.Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0, charset='utf8', decode_responses=True)
redis_code = r.get(str(mobile))
if redis_code != code:
raise forms.ValidationError('验证码不正确')
return self.cleaned_data
class RegisterView(View):
# get 请求将HTML 和验证码返回前端
def get(self,request):
register_form = RegisterGetForm()
return render(request,'register.html',{'register_form':register_form})
# 注册提交的数据进行处理
def post(self,request):
# 表单验证
register_post_form = RegisterPostForm(request.POST)
# 表单验证是否通过
if register_post_form.is_valid():
# 如果通过获取手机号 + 密码
mobile = register_post_form.cleaned_data.get('mobile')
password = register_post_form.cleaned_data.get('password')
# 新建一个用户
user = UserProfile(username=mobile)
user.set_password(password)
user.mobile = mobile
user.save()
# 登录
login(request,user)
return redirect(reverse('front:index'))
else:
# print(register_post_form.errors.get_json_data())
register_form = RegisterGetForm()
content = {
'register_form':register_form,
'forms_errors':register_post_form.errors
}
return render(request,'register.html',context=content)