以下是我的代码,我想利用腾讯云短信和ajax实现给手机发短信,但现在控制台返回内部服务器错误的信息,原因是什么我该如何修改?
前端代码
<html>
<head>
<meta http-equiv="content-type" content="text/html;
charset=UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1, maximum-scale=1,user-scalable=no">
<title>注册</title>
{% load static %}
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css'%}">
<link rel="stylesheet" href="{% static 'plugins/font-awesome-4.7.0/css/font-awesome.css'%}">
<link rel="stylesheet"
href="{% static 'plugins/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css'%}">
</head>
<body>
<div class="account">
<h2 style="text-align:center;">用户注册</h2>
<form method="POST" style="margin-top:20px;" novalidate>
{% csrf_token %}
{% for field in form %}
{% if field.name == 'code' %}
<div class="form-group" style="margin-top:20px;">
<label> {{ field.label}}</label>
<div class="clearfix">
<div class="col-md-6" style="padding:0;">{{field}}</div>
<div class="col-md-6"><input id="btnSms" type="button" class="btn btn-default" value="点击获取验证码"></div>
</div>
<span class="error-msg" style="color:red;position:absolute"></span>
</div>
{% else %}
<div class="form-group" style="margin-top:20px;">
<label> {{ field.label}}</label>
{{field}}
<span class="error-msg" style="color:red;position:absolute"></span>
{% endif %}
{%endfor%}
<div>
<input style="height:35px;width:200px; margin-left:90px; font-size:17px;" type="submit" value="注册"
class="btn btn-info">
</div>
<div>
<span style="float: right; margin-top:20px;">已有账号.<a style=" text-decoration:none;" href=" ">去登录</a ></span>
</div>
</div>
</form>
</div>
<script src="{% static 'js/jquery-3.5.1/jquery-3.5.1.min.js'%}"></script>
<script>
//页面加载完自动执行函数
$(function(){
bindClickBtnSms();
});
//点击获取验证码的按钮绑定事件
function bindClickBtnSms(){
$('#btnSms').click(function(){
$(".error-msg").empty();
//获取用户输入的手机号
var mobile=$('#id_mobile').val();
//发送ajax请求
$.ajax({
url:"/send/sms/",
type:"GET",
data:{mobile: mobile,tpl: "register"},
dataType: 'json',
success:function(res){
//ajax请求发送成功后,自动执行函数
if (res.status){
sendSmsRemind();
}else{
//错误信息
$.each(res.error,function(key,value){
$('#id_'+key).next().text(value[0]);
})
}
}
error:function(xhr,status,error){
console.log('ajax请求失败:'+error)}
})
})
}
//倒计时
function sendSmsRemind() {
var $smsBtn=$('#smsBtn');
$smsBtn.prop('disabled',true); //禁用
var time =60;
var remind=setInterval(function (){
$smsBtn.val(time + '秒重新发送');
time=time-1;
if (time<1){
clearInterval(remind);
$smsBtn.val('点击获取验证码').prop('disabled',false);
}
},1000)
}
</script>
</body>
</html>
后端代码
class SendSmsForm(forms.Form):
mobile = forms.CharField(label="手机号", validators=[RegexValidator(r'^(1[3|4|5|6|7|8|9])\d{9}$', '手机号格式错误'), ])
def __init__(self, request, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request = request
def clean_mobile(self):
"""手机号校验的勾子"""
mobile = self.cleaned_data['mobile']
# 判断短信模板是否有问题
tpl = self.request.GET.get('tpl')
template_id = settings.TENCENT_SMS_TEMPLATE.get(tpl)
if not template_id:
raise ValidationError("短信模板错误")
# 校验数据库中是否已有手机号
exist = models.Username.objects.filter(mobile=mobile).exists()
if exist:
raise ValidationError('手机号已存在')
# 发短信 & 写redis
code = random.randrange(100000, 999999)
sms = send_sms_single(mobile, template_id, [code, ])
if sms['result'] != 0:
raise ValidationError("短信发送失败,{}".format(sms['errmsg']))
# 验证码写入redis
conn = get_redis_connection()
conn.set(mobile, code, ex=60)
return mobile
def send_sms(request):
"""发送短信"""
form = SendSmsForm(request, data=request.GET)
# 校验手机号,不能为空
if form.is_valid():
return JsonResponse({'status': True})
return JsonResponse({'status': False, 'error': form.errors})
def register(request):
"""注册"""
form = RegisterModelForm()
return render(request, 'register.html', {'form': form})
def send_sms_single(phone_num, template_id, template_param_list):
"""
单条发送短信
:param phone_num:手机号
:param template_id:腾讯云短信模板ID
:param template_param_list:短信模板所需参数列表,例如【验证码:{1},描述:{2},则传递参数】
:return:
"""
appid = settings.TENCENT_SMS_APP_ID # 自己应用ID
appkey = settings.TENCENT_SMS_APP_KEY # 自己应用key
sms_sign = settings.TENCENT_SMS_SIGN # 自己腾讯云创建签名时填写的签名内容
sender = SmsSingleSender(appid, appkey)
try:
response = sender.send_with_param(86, phone_num, template_id, template_param_list, sign=sms_sign)
except HTTPError as e:
print(e)
response = {'result': 1000, 'errmsg': "网络异常发送失败"}
return response
错误
ajax请求失败:Internal Server Error