2401_83940696 2024-07-23 14:36 采纳率: 2.1%
浏览 6
已结题

为什么报错显示得到一个意外的关键词参数?

以下是我的,我准备利用腾讯云和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]);
                            })
                        }
                    }
                })

            })
        }
        //倒计时
        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})
# 短信模板
# 腾讯云短信应用 app_id
TENCENT_SMS_APP_ID = 1400302209
# 腾讯云短信应用 app_key
TENCENT_SMS_APP_KEY = '8cc5bf076454953306eb668187930004'
# 腾讯云短信签名内容
TENCENT_SMS_SIGN = "Python之路"

TENCENT_SMS_TEMPLATE = {
    'register': 548760,
    'login': 548762}

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

错误

TypeError: JSONDecoder.__init__() got an unexpected keyword argument 'encoding'

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-23 14:39
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的代码和错误信息,我们可以逐步排查并解决这些问题。以下是一些具体的操作步骤和建议:

    1. 解决前端 AJAX 请求中的错误

    错误信息TypeError: JSONDecoder.__init__() got an unexpected keyword argument 'encoding'

    可能原因:这个错误通常是由于后端返回的响应不是有效的 JSON 格式。在你的后端代码中,JsonResponse 可能没有正确地构造。

    解决方案

    • 确保后端返回的响应是有效的 JSON 格式。检查 JsonResponse 是否正确构造。

    2. 确保 AJAX 请求正确发送到后端

    前端代码检查

    • 检查 AJAX 请求的 url 是否正确。
    • 检查 AJAX 请求的 type 是否设置为 "GET"。
    • 检查 AJAX 请求的 data 对象中的字段名是否与后端期望的字段名一致。

    代码示例

    $.ajax({
        url: "/send/sms/",
        type: "GET",
        data: {mobile: mobile, tpl: "register"},
        dataType: 'json', // 确保这里使用小写 'json'
        success: function(res){
            if (res.status){
                sendSmsRemind();
            }else{
                $.each(res.error, function(key, value){
                    $('#id_'+key).next().text(value[0]);
                })
            }
        }
    })
    

    3. 验证后端接收 AJAX 请求的数据

    后端代码检查

    • 确保后端能够正确解析 AJAX 发送的数据。
    • 检查 SendSmsForm 是否正确处理 GET 请求的数据。

    代码示例

    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})
    

    4. 确保后端正确响应 AJAX 请求

    后端代码检查

    • 确保 JsonResponse 构造时没有传入不必要的参数。
    • 检查 JsonResponse 是否正确处理编码问题。

    代码示例

    from django.http import JsonResponse
    
    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})
    

    5. 前端处理 AJAX 请求的响应

    前端代码检查

    • 添加错误处理逻辑,以便在 AJAX 请求失败时提供反馈给用户。

    代码示例

    $.ajax({
        url: "/send/sms/",
        type: "GET",
        data: {mobile: mobile, tpl: "register"},
        dataType: 'json',
        success: function(res){
            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);
            // 可以在这里处理错误,例如显示错误消息
        }
    })
    

    总结

    1. 检查 AJAX 请求的 dataType 参数:确保使用小写 'json'。
    2. 确保 AJAX 请求的 data 对象中的字段名与后端期望的字段名一致
    3. 在后端,检查 JsonResponse 是否正确构造:避免传入不必要的参数。
    4. 在后端处理函数中,确保对 AJAX 发送的数据进行适当的验证和错误处理
    5. 在前端,添加错误处理逻辑:以便在 AJAX 请求失败时提供反馈给用户。

    通过这些步骤,你应该能够解决 AJAX 请求中出现的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 创建了问题 7月23日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?