先注册并完成腾讯云短信服务的审核,包括签名和模板;安装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 %}
过程中踩的坑
1.redis没有安装服务,折腾很久。win没有官方支持。只是开发的话可以去找安装包,用官方的虚拟机方式太复杂。
2.send(),中都是字符串,要先使用str()。
3.redis的版本问题比较突出,很大可能django和redis的版本会有问题,这里django使用的是4.0.
4.{% csrf_token %}的使用,一个页面同时使用表单和ajax时并跳转登录时,需要使用2次,一次必须在form 中。



