1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > django实现腾讯云短信sdk和redis缓存服务 手机号验证码登录 未注册直接注册登录

django实现腾讯云短信sdk和redis缓存服务 手机号验证码登录 未注册直接注册登录

时间:2020-06-04 09:36:28

相关推荐

django实现腾讯云短信sdk和redis缓存服务 手机号验证码登录 未注册直接注册登录

先注册并完成腾讯云短信服务的审核,包括签名和模板;安装redis服务;

1.安装必要库

pip install --upgrade tencentcloud-sdk-python如果同时有python3/2,请用pip3.pip install redis#要单独安装redis库pip install django-redis#缓存库,2个都需要#另需要安装redis server,并在启动状态,并不是只安装库就可以

2.编辑settings中添加:

#短信设置SMS_SDK_APPID = '14006******'#短信服务应用的IDSMS_APP_KEY = 'd79153b66796c3c3f*************'#这个不是必须的SMS_SECRET_ID = 'AKID2yhEf0HnIi5OdvBf*************'#访问控制的密匙IDSMS_SECRET_KEY = 'KZjnolXFrMk3Laknk************'#访问控制的密匙SMS_SIGN='****' #必须和通过审核的一样#正文参数SMS_TEMPLATE_ID={'login':'138****'}#模板参数#配置Redis替代session,主要是为了控制时间。#配置Redis为Django缓存CACHES = {"default": {#"BACKEND": "django_redis.cache.RedisCache","BACKEND": "django.core.cache.backends.redis.RedisCache","LOCATION": "redis://127.0.0.1:6379/0", #地址#"OPTIONS": {#"CLIENT_CLASS": "django_redis.client.DefaultClient",#"CLIENT_CLASS": "django.core.cache.backends.redis.client.DefaultClient",#}}}# 将session缓存在Redis中SESSION_ENGINE = "django.contrib.sessions.backends.cache"SESSION_CACHE_ALIAS = "default"# session 设置(可以不写)SESSION_COOKIE_AGE = 60 * 60 * 12 # 12小时SESSION_SAVE_EVERY_REQUEST = TrueSESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,则COOKIE失效

3.新建sms.py文件:

# -*- coding: utf-8 -*-from mon import credentialfrom mon.exception.tencent_cloud_sdk_exception import TencentCloudSDKException# 导入 SMS 模块的client modelsfrom tencentcloud.sms.v0711 import sms_client, modelsfrom django.conf import settingsclass MySmsSender:#先在settings中设置参数,这里使用settings调用比较安全,也可以不设置这里直接填写。def __init__(self):self.cred = credential.Credential(settings.SMS_SECRET_ID, settings.SMS_SECRET_KEY)self.client = sms_client.SmsClient(self.cred, "ap-guangzhou", )self.req = models.SendSmsRequest()self.req.SmsSdkAppid = settings.SMS_SDK_APPIDself.req.Sign = settings.SMS_SIGNdef send(self, phone_number, template_id, sms_code):"""发送短信的功能:param phone_number: 手机号:param template_id: 短信模板id:param sms_code:短信验证码 (注意:4-6位):return:使用示例obj = MySmsSender()obj.send('手机号',settings.SMS_TEMPLATE_ID['login'],'短信验证码')"""try:self.req.PhoneNumberSet = ["+86{}".format(phone_number.strip()), ]# 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 IDself.req.TemplateID = template_id# 模板参数: 若无模板参数,则设置为空self.req.TemplateParamSet = [sms_code]# 给腾讯云发送请求,让腾讯云发送短信resp = self.client.SendSms(self.req)# resp发送短信后的响应结果,可以用来判断,短信是否发送成功了# print(type(resp), resp)# print(resp.SendStatusSet[0].Code) #'Ok'return resp.SendStatusSet[0].Code# from tencentcloud.sms.v0711.models import SendSmsResponseexcept TencentCloudSDKException as err:print(err)return 'error'

4.forms

class mobilenameForm(forms.Form):mobilename=forms.CharField(max_length=11,min_length=11,label='mobilename')mobilecode=forms.CharField(max_length=4,min_length=4,label='mobilecode')

5..views文件

def mysendsms(request):if request.method=='POST':mobileNamber=request.POST.get("mobilename")mobileNamber_str=str(mobileNamber)sms_code=str(random.randint(1000,9999))mysend=MySmsSender()mytelephoneid=settings.SMS_TEMPLATE_ID['login'] #测试时使用固定验证码#cache.set(mobileNamber_str,'4321',60)cache.set(mobileNamber,sms_code,60)mysend.send(mobileNamber_str,mytelephoneid,sms_code)return HttpResponse() def registerandlogin(request):myusermobileform=mobilenameForm() if request.method=='POST': mobileName = request.POST.get('mobilename') code = request.POST.get('mobilecode')mobileNamber=str(mobileName)my_local_code=cache.get(mobileNamber)myuser=MyUser.objects.filter(mobilename=mobileName).first()if code==my_local_code and myuser:login(request,myuser)return redirect('quest:index')elif code==my_local_code:MyUser.objects.create(mobilename=mobileName,username=mobileName)myuser=MyUser.objects.get(mobilename=mobileName)login(request,myuser)return redirect('quest:index')elif myuser:return HttpResponse('验证码错误') '''if myuser:login(request,myuser)return redirect('quest:index')else:MyUser.objects.create(mobilename=mobileName)myuser=MyUser.objects.get(mobilename=mobileName)login(request,myuser)return redirect('quest:index')'''else:return HttpResponse('失败') context={'myusermobileform':myusermobileform}return render(request,'myuser/registerandlogin.html',context)

6.models文件

from django.db import models#自定义用户模型和管理工具from django.contrib.auth.models import AbstractUser,BaseUserManager#校验长度from django.core.validators import MinValueValidator, MaxValueValidatorimport uuidfrom django.forms import DateTimeField#自定义用户模型class MyUser(AbstractUser):#用户名使用手机号码uuid=models.UUIDField(default=uuid.uuid4,unique=True)#上线时改为blank=True,而不要使用null=Truemobilename = models.CharField(max_length=12,unique=True,verbose_name='手机号',)#USERNAME_FIELD='mobilename'last_login=models.DateTimeField(auto_now=True)def __str__(self):return str(self.mobilename)class Meta:#数据库表名#db_table = 'user'verbose_name = '用户'verbose_name_plural = '用户'

7.registerandlogin.html文件;

需要先配置jquery文件和js文件和ajax

{% csrf_token %}<form method='POST'>{% csrf_token %}手机号:{{ myusermobileform.mobilename }}<button class="btn btn-default" type="button" id="b1">获取验证码</button>验证码:{{ myusermobileform.mobilecode }}<input type="submit" value="登录" ></form><script>$("#b1").click(function () {$.ajax({ url: " {% url 'myusers:mysendsms' %} ", type: "post",data: {"mobilename": $("input[name='mobilename']").val(),"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val()},success: function (res){$('#b1').val(res)},error: function (err) {console.log(err);}})})</script>

过程中踩的坑

1.redis没有安装服务,折腾很久。win没有官方支持。只是开发的话可以去找安装包,用官方的虚拟机方式太复杂。

2.send(),中都是字符串,要先使用str()。

3.redis的版本问题比较突出,很大可能django和redis的版本会有问题,这里django使用的是4.0.

4.{% csrf_token %}的使用,一个页面同时使用表单和ajax时并跳转登录时,需要使用2次,一次必须在form 中。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。