栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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******'#短信服务应用的ID
SMS_APP_KEY = 'd79153b66796c3c3f*************'#这个不是必须的
SMS_SECRET_ID = 'AKID2yhEf0HnIi5OdvBf*************'#访问控制的密匙ID
SMS_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 = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,则COOKIE失效

 

3.新建sms.py文件:
# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 导入 SMS 模块的client models
from tencentcloud.sms.v20190711 import sms_client, models
from django.conf import settings


class 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_APPID
        self.req.Sign = settings.SMS_SIGN

    def 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,可登录 [短信控制台] 查看模板 ID
            self.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.v20190711.models import SendSmsResponse
        except 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, MaxValueValidator
import uuid

from django.forms import DateTimeField



#自定义用户模型
class MyUser(AbstractUser):
    #用户名使用手机号码
    uuid=models.UUIDField(default=uuid.uuid4,unique=True)
    #上线时改为blank=True,而不要使用null=True
    mobilename = 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 %}
    
{% csrf_token %} 手机号:{{ myusermobileform.mobilename }} 验证码:{{ myusermobileform.mobilecode }}
过程中踩的坑

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/882139.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号