前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django使用腾讯云发送短信并存入redis

Django使用腾讯云发送短信并存入redis

作者头像
lyudev
发布于 2022-08-04 02:57:21
发布于 2022-08-04 02:57:21
2.1K00
代码可运行
举报
文章被收录于专栏:代码即数据代码即数据
运行总次数:0
代码可运行

models.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserInfo(models.Model):
    username = models.CharField(verbose_name='用户名', max_length=32)
    email = models.CharField(verbose_name='邮箱', max_length=32)
    mobile_phone = models.CharField(verbose_name='手机号', max_length=32)
    password = models.CharField(verbose_name='密码', max_length=32)

settings.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 短信的配置
TENCENT_SMS_APP_ID = 111  # 自己应用ID
TENCENT_SMS_APP_KEY = "222"  # 自己应用Key
TENCENT_SMS_APP_SIGN = "333"  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)
TENCENT_SMS_TEMPLATE = {
    'login': 1344088,
    'register': 1344087
}

tencent/sms.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError
from django.conf import settings

def send_sms_single(phone_num, template_id, template_param_list):
    """
    单条发送短信
    :param phone_num: 手机号
    :param template_id: 腾讯云短信模板ID
    :param template_param_list: 短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = settings.TENCENT_SMS_APP_ID  # 自己应用ID
    appkey = settings.TENCENT_SMS_APP_KEY  # 自己应用Key
    sms_sign = settings.TENCENT_SMS_APP_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:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response


def send_sms_multi(phone_num_list, template_id, param_list):
    """
    批量发送短信
    :param phone_num_list:手机号列表
    :param template_id:腾讯云短信模板ID
    :param param_list:短信模板所需参数列表,例如:【验证码:{1},描述:{2}】,则传递参数 [888,666]按顺序去格式化模板
    :return:
    """
    appid = settings.TENCENT_SMS_APP_ID  # 自己应用ID
    appkey = settings.TENCENT_SMS_APP_KEY  # 自己应用Key
    sms_sign = settings.TENCENT_SMS_APP_SIGN  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)
    sender = SmsMultiSender(appid, appkey)
    try:
        response = sender.send_with_param(86, phone_num_list, template_id, param_list, sign=sms_sign)
    except HTTPError as e:
        response = {'result': 1000, 'errmsg': "网络异常发送失败"}
    return response

forms/account.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django import forms
from django.core.exceptions import ValidationError
import random
from app import models
from django.core.validators import RegexValidator
from django.conf import settings
from utils.tencent.sms import send_sms_single
from django_redis import get_redis_connection


class RegisterModelForm(forms.ModelForm):
    mobile_phone = forms.CharField(label='手机号', validators=[RegexValidator(r'^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$', '手机号格式错误。')])
    password = forms.CharField(label='密码', widget=forms.PasswordInput())
    confirm_password = forms.CharField(label='重复密码', widget=forms.PasswordInput())
    code = forms.CharField(label='验证码', widget=forms.TextInput())

    class Meta:
        model = models.UserInfo
        fields = ['username', 'email', 'password', 'confirm_password', 'mobile_phone', 'code']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'
            field.widget.attrs['placeholder'] = '请输入%s' % field.label


class SendSmsForm(forms.Form):
    mobile_phone = forms.CharField(label='手机号', validators=[RegexValidator(r'^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$', '手机号格式错误。')])

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_mobile_phone(self):
        mobile_phone = self.cleaned_data['mobile_phone']
        """判断短信模板是否有问题"""
        tpl = self.request.GET.get("tpl")
        template_id = settings.TENCENT_SMS_TEMPLATE.get(tpl)
        if not template_id:
            raise ValidationError("短信模板错误。")
        exists = models.UserInfo.objects.filter(mobile_phone=mobile_phone).exists()
        if exists:
            raise ValidationError("手机号已存在。")
        code = random.randrange(1000, 9999)
        sms = send_sms_single(mobile_phone, template_id, [code, ])
        if sms['result'] != 0:
            raise ValidationError("短信发送失败{}".format(sms['errmsg']))
        conn = get_redis_connection()
        conn.set(mobile_phone, code, ex=60)
        # print(conn.get('mobile_phone'))
        return mobile_phone

views/account.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render, HttpResponse
from web.forms.account import RegisterModelForm, SendSmsForm
from django.http import JsonResponse


def register(request):
    form = RegisterModelForm()
    return render(request, 'register.html', {'form': form})


def smscode(request):
    """发送短信"""
    form = SendSmsForm(request, data=request.GET)
    if form.is_valid():
        return JsonResponse({'status': True})
    return JsonResponse({'status': False, 'error': form.errors})

urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.urls import path ,re_path,include
from web.views import account
from app import views

urlpatterns = [
    re_path(r'^send/sms/', views.send_sms, name='send_sms'),
    re_path(r'^register/$', account.register, name='register'),
    re_path(r'^send/smscode/$', account.smscode, name='send_smscode'),
]

前端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3 account">
                <h3>用户注册</h3>
                <form id="form" method="POST" novalidate>
                    {% csrf_token %}
                    {% for item in form %}
                        {% if item.name == 'code' %}
                            <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ item.label }}</label>
                                <div class="row">
                                    <div class="col-md-6 col-xs-6">
                                        {{ item }}
                                    </div>
                                    <div class="col-md-6 col-xs-6">
                                        <input type="button" id="smsBtn" class="btn btn-default" value="发送验证码">
                                    </div>
                                </div>
                            </div>
                        {% else %}
                            <div class="form-group">
                                <label for="{{ field.id_for_label }}">{{ item.label }}</label>
                                {{ item }}
                              <span class="error-msg"></span>
                            </div>
                        {% endif %}
                    {% endfor %}
                    <button type="submit" class="btn btn-primary">注册</button>
                </form>
            </div>
        </div>
    </div><script>


        $(function () {
            bindSmsBtn()
        })

        function bindSmsBtn() {
            $('#smsBtn').on('click', function () {
                $(".error-msg").empty();
                var mobilePhone = $('#id_mobile_phone').val();
                $.ajax({
                    url: "/send/smscode/",
                    data: {
                        "mobile_phone": mobilePhone,
                        "tpl": 'register'
                    },
                    type: "GET",
                    dataType:"JSON",
                    success: function (res) {
                        console.log(res)
                        if(res.status){
                            console.log("发送成功")
                        }
                        else{
                            console.log("sss")
                            $.each(res.error,function(key,value){
                                $("#id_"+key).next('span').text(value[0])
                            })
                        }
                    }

                })
            })


        }
    </script>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码即数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【玩转腾讯云】Python 操作腾讯云短信(sms)详细教程
腾讯云短信 1. 注册腾讯云 <font color="red">已有腾讯云账号可直接跳到第二步</font> 官网 注册, 微信扫码关注腾讯云助手即可快速注册 [biu6v2it00.png] 选择 注册新账号,注册完成后,实名认证一下。选择 个人认证,填写一下信息就ok了。 [x1ldepiqx3.png][xqyn1acnua.png][kp5t4xp99f.png] <span id="sms"></span> 2. 开通腾讯云短信 通过上一步我们已经注册好了腾讯云账号,接下来去开通 腾讯云短信 功
ruochen
2021/04/11
14K0
【玩转腾讯云】Python 操作腾讯云短信(sms)详细教程
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
    短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务分别来体验一下国际短信和国内短信接口。
用户9127725
2022/08/08
5.4K0
Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信
【玩转腾讯云】django 开发Bug追踪平台之用户注册篇(基于腾讯云短信 & redis)
项目预览 👉 Bug追踪平台【云短信买不起了,可通过 手机号:18203503747 密码:ruochen666 登入体验】 项目gitee地址 👉 saas 本篇教程对应代码为 【注册验证码处理】提交,可通过对应分支查看 用户注册篇 首先,总体的<font color="red">思维导图</font>如下: [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5MzM5NDY3,siz
ruochen
2021/04/11
27.3K0
【玩转腾讯云】django 开发Bug追踪平台之用户注册篇(基于腾讯云短信 & redis)
Form和ModelForm组件
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
py3study
2020/01/16
5.2K0
12.Django基础十之Form和ModelForm组件
  我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
changxin7
2019/10/08
3.5K0
SDK怎么测试?俺不会啊!
众所周知,在云产品和SaaS蓬勃发展的当下,企业中有许多系统和环节都是依赖于第三方提供的服务或应用,而不必自己去搭建和实现,从而节省人力和物力,避免重复造轮子。
测试蔡坨坨
2022/12/21
3.2K0
SDK怎么测试?俺不会啊!
Python Day18 Django
这样,下次再访问时通过获取cookie中的"sessionid"的值就可以得到所对应的session-data
py3study
2020/01/14
1.2K0
Django项目知识点(二)
通过@register.simple_tag()注册,可以设置name属性,不设置就是函数名
润森
2019/09/11
8160
Django项目知识点(二)
Django之Form组件
  我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
py3study
2020/01/17
1.2K0
Django之Form表单
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示显示对应的错误信息.。 Django form组件就实现了上面所述的功能。 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 Django For
人生不如戏
2018/04/12
3K0
qcloudsms_py短信发送和easyquotation股票实时数据获取
有时候我们做股票投资,需要实时盯盘。而盯盘的任务我们完全可以交给计算机,因此当信号出现的时候知会自个是很有必要的,但是前提是获取实时数据并判断是否发送短信提醒,这块作者在网上找了一写资料,算是留个记录,方便日后用到。
写一点笔记
2022/08/11
1.2K0
qcloudsms_py短信发送和easyquotation股票实时数据获取
Django学习笔记之利用Form和Ajax实现注册功能
一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2
Jetpropelledsnake21
2018/07/04
9360
短信验证功能实现
创建签名时候看他需要你提供给他什么资料你就提交什么资料,一般弄个公众号截图管理员页面即可通过审核
小小咸鱼YwY
2020/06/19
3.5K0
【笔记整理】SpringBoot集成腾讯云短信
前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringBoot工程集成测试。
pbinlog
2022/04/18
8K0
java实现发短信功能---腾讯云短信
前言 如今发短信功能已经成为互联网公司的标配,本篇文章将一步步实现java发送短信 考察了许多提供短信服务的三方,几乎所有都需要企业认证才可以使用,这对于个人学习非常不方便。多方比较之后,选择了腾讯云(此处并非做广告),原因有两点: 支持微信公众号认证(门槛低) 每月赠送100条免费短信(适合个人学习)(这一点请矿家子弟自行忽略)。超过100条的时候, 可以开通收费短信服务-腾讯云短信服务套餐 [or5qsa3nyy.png] 开发环境 请参照: 基于SpringBoot构建分模块项目 腾讯云 ---短信
聚优云惠
2019/12/26
27K0
Django之forms组件
  我们在写注册页面时,之前只是提交了数据,然后就保存了数据,后端根本就没有对数据进行校验,比如价格写的不是纯数字也让保存,这肯定是不行的,在前端是可以校验的,但我们不能只依靠前端验证,万一前端不校验,那整个过程就没校验了,所以,不管前端有没有校验,我们后端都应该进行验证。
py3study
2020/01/21
2.3K0
Django—Form、ModelFor
一、Form form.py from django import forms from django.core.exceptions import ValidationError from django.contrib.auth.models import User import re # 定义手机号验证规则 def phone_validate(value): phone = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[
py3study
2020/01/16
1K0
Django 之Form表单的常用操作
普通Form表单的提交 <!-- name:index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/" method="post"> <p>账号:<input type="text" name="username"><span>{{ error.username }}<
王瑞MVP
2022/12/28
1.2K0
Python:Django框架
Models :负责与数据库交互 Views:负责接收请求、获取数据、返回结果 Templates:负责呈现内容到浏览器
小简
2022/12/29
4.6K0
Python:Django框架
Django实现调用腾讯云短信接口
腾讯云短信接口 注册 登录 具体怎么注册腾讯云接口看下面的文章吧 腾讯云接口注册 1.0 安装SDK pip3 install qcloudsms_py conda install qcloudsms_py 1.1 编写发送短信接口 我的环境是基于django TENCENT_SMS_APP_ID, TENCENT_SMS_APP_KEY, TENCENT_SMS_SIG: 分别都写在了settings.develop配置文件下 # tencent/smsket.py i
Yuou
2022/09/26
13.1K0
相关推荐
【玩转腾讯云】Python 操作腾讯云短信(sms)详细教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验