腾讯云短信

由于项目在注册、登录、找回密码 时需要发送短信验证的功能,我们使用腾讯云短信做。

为什么要用腾讯云短信呢? 因为注册就送 100条免费短信 的额度。哈哈哈哈,发短信的功能你就不用花钱了。

1.注册腾讯云 & 开通云短信

1.1 注册并认证

注册一个腾讯云账户,腾讯云中提供了很多功能:云服务器、云存储你、云直播、云短信等很多功能。

注册地址:https://cloud.tencent.com/

根据提示一步步进行注册即可,例如:




实名注册时,什么行业、通讯等信息,按照自己的的实际情况填写即可,实在不知道的可以随便填。

1.2 开通云短信

腾讯云注册成功之后,登录腾讯云并去开通 云短信服务,开通短信服务后才能发短信。

开通地址:https://console.cloud.tencent.com/smsv2

根据流程进行开通之后,就可以进入云短信控制台。

2. 创建应用

创建应用并将应用中生成的 SDK AppID和 App Key 复制下来,之后通过python发送短信时需要用到。

3. 创建签名

在腾讯云短信签名时需要认证,认证需要填写签名类型:网站、APP、小程序、公众号,前三种需要提供企业资质等复杂的东西,个人公众号认证会比较便捷,所以推荐个人开发的话使用 公众号 进行签名。

so,咱们需要先 申请一个公众号 然后 创建签名 。

3.1 申请微信订阅号

注册地址:https://mp.weixin.qq.com/

3.2 创建签名

根据自己的需求选择 国内短信/国际短信 中的签名管理,进行创建签名。

切记:签名类型选择 公众号 ,并根据提示上传相关数据即可。

签名创建并审核通过后,把你提交的 签名内容 值保存下来,之后Python发送短信用。

提醒:签名创建完成之后,需要等待腾讯进行审核,也可以联系他们客服QQ加速审核。

4. 创建模板

根据自己需求创建短信模板,以后根据模板进行发送短信,例如:您的注册验证码:{1},如非本人操作,请忽略本短信!

模板创建并审核通过之后,把 模板ID 保存下来,之后Python发送短信用。

5. 发送短信

上述的准备工作做完中我们开通相关服务并获取到如下几个值:

  • 创建应用,获取到 appid 和 appkey

  • 创建签名,获取 签名内容

  • 创建模板,获取 模板ID

接下来开始使用Python发送短信。

第一步:安装SDK

  1. pip install qcloudsms_py

第二步:基于SDK发送短信

#!/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
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 = 112142311  # 自己应用ID
    appkey = "8cc5b87123y423423412387930004"  # 自己应用Key
    sms_sign = "Python之路"  # 自己腾讯云创建签名时填写的签名内容(使用公众号的话这个值一般是公众号全称或简称)
    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 = 112142311
    appkey = "8cc5b87123y423423412387930004"
    sms_sign = "Python之路"
    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
if __name__ == '__main__':
    result1 = send_sms_single("15131255089", 548760, [666, ])
    print(result1)
    result2 = send_sms_single( ["15131255089", "15131255089", "15131255089", ],548760, [999, ])
    print(result2)
View Code

6. 关于频率限制

腾讯云短信后台可以进行 短信频率 的限制。

但是,由于我们是免费用户所以无法进行设置,只能使用默认的配置(30秒发1条/1小时发5条/1天发10条)。

相信大家曾经都有过这样的经历:注册某个网站时,通过点击获取短信验证码,而验证码会一般会有60秒的超时时间限制,即:60s之后短信验证码失效,需重新获取验证码。

刚才说的短信验证码失效的事 和 今天的话题redis有什么关系呢?

redis是一个软件,他恰好提供了一个可以设置值并允许设定超时时间的功能,例如:

例如:我在redis中设置一个 键 值 并指定超时时间为 10 秒,简化之后可以这样实现 conn.set("15131255089",9871,10),之后还可以根据 键 再可以去获取对应的值 value = conn.get("15131255089"),如果已超时则获取的值为空。

so,今天要给大家先聊聊redis,这样以后在项目中我们就可以用上他了。

声明:redis中要学的知识点非常多,而这些redis专项内容会在咱们之后的Linux架构的课程中详细讲解,本节主要以“短信超时”功能为目的来讲解。

1. 什么是redis?

官方:Redis是一个使用 C语言 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
白话:Redis是一个软件,这个软件可以帮助我们维护一部分内存,让我们往那块内存中进行存取值。如果数据在内存中存储,遇到宕机那么数据就会丢失,而redis解决了这个问题,他可以将内存中的数据以某种策略存储到硬盘,以保证宕机数据不丢失。

Redis和MySQL数据库的比较?

  1. redis,直接在内存中进行存取数据,速度非常快;由于在内存,所以存储的数据不能太多,内存一般8G/16G;对数据可以设置自动超时时间;
  2. mysql,通过SQL语句操作的数据都在硬盘上,速度相对慢;由于存储在硬盘,所以存储的数据可以非常多,硬盘一般500G/1T;数据不能自动超时,想超时需要自定写SQL处理;

2. 安装redis

由于目前同学们还未接触过 Linux 操作系统,所以大家可以先安装到windows系统上来进行学习。

注意:以后在工作中使用到redis时,都是需要安装在Linux操作系统上,咱们后期Linux架构课程会单独讲解Linux并带着大家手把手搭建redis和高可用及集群等。

2.1 下载redis

选择最新稳定版安装,地址:https://github.com/microsoftarchive/redis/releases

示例图片

提醒:截止目前redis稳定版本已到 5.0 ,由于windows实际应用不多,所以版本就比较滞后。

2.2 安装redis

找到已下载好的安装包,根据下图的提示按步骤点击执行即可。

最后点击next就开始安装,直至安装成功,成功之后所有redis相关安装的窗口都会自动关闭。

2.3 修改配置

redis这个软件安装上之后,需要对他进行一些基本设置,以便于我们以后可以通过python代码来对redis中的数据进行操作。

  • 打开配置文件,redis安装的目录下的 redis.windows-service.conf 文件

  • 修改配置

    • 设置绑定IP,如果想要让局域网内其他主机访问自己的redis,需要设置 bind 0.0.0.0

    • 设置redis密码,如果想需要提供密码再登录redis,需要设置 requirepass 密码

2.4 启动redis

安装和配置完成之后,需要启动redis。

  • 打开电脑的【控制面板】,然后选择【管理工具】,在选择【服务】

  • 启动 或 关闭,在右边找到并选中redis服务,然后点击 重启动 或 关闭

3. redis-cli连接redis

redis安装并启动之后,就可以通过各种客户端连接redis并做各种操作。

redis-cli是安装上redis之后自带的客户端工具,他可以让我们快速通过命令对redis操作。

在windows中打开终端,输入 redis-cli 就可以使用这个客户端了。例如:

4. python连接redis

python代码也可以实现连接redis并对redis中进行各种操作。python代码想要操作redis必须先安装相关模块。

提示:在安装redis的主机上执行 ipconfig 获取redis的IP(windows系统)

第一步:安装python操作redis模块

  1. pip3 install redis

第二步:写代码去操作redis

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
# 直接连接redis
conn = redis.Redis(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8')
# 设置键值:15131255089="9999" 且超时时间为10秒(值写入到redis时会自动转字符串)
conn.set('15131255089', 9999, ex=10)
# 根据键获取值:如果存在获取值(获取到的是字节类型);不存在则返回None
value = conn.get('15131255089')
print(value)
View Code

上面python操作redis的示例是以直接创建连接的方式实现,每次操作redis如果都重新连接一次效率会比较低,建议使用redis连接池来替换,例如:

import redis
# 创建redis连接池(默认连接池最大连接数 2**31=2147483648)
pool = redis.ConnectionPool(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', max_connections=1000)
# 去连接池中获取一个连接
conn = redis.Redis(connection_pool=pool)
# 设置键值:15131255089="9999" 且超时时间为10秒(值写入到redis时会自动转字符串)
conn.set('name', "武沛齐", ex=10)
# 根据键获取值:如果存在获取值(获取到的是字节类型);不存在则返回None
value = conn.get('name')
print(value)
View Code

5. django连接redis

按理说搞定上一步python代码操作redis之后,在django中应用只需要把上面的代码写到django就可以了。

例如:django的视图函数中操作redis

import redis
from django.shortcuts import HttpResponse
# 创建redis连接池
POOL = redis.ConnectionPool(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', max_connections=1000)
def index(request):
    # 去连接池中获取一个连接
    conn = redis.Redis(connection_pool=POOL)
    conn.set('name', "武沛齐", ex=10)
    value = conn.get('name')
    print(value)
    return HttpResponse("ok")
View Code

 

上述可以实现在django中操作redis。但是,这种形式有点非主流,因为在django中一般不这么干,而是用另一种更加简便的的方式。

第一步:安装django-redis模块(内部依赖redis模块)

  1. pip3 install django-redis

第二步:在django项目的settings.py中添加相关配置

# 上面是django项目settings中的其他配置....
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://10.211.55.28:6379", # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            "PASSWORD": "foobared" # redis密码
        }
    }
}
View Code

第三步:在django的视图中操作redis

from django.shortcuts import HttpResponse
from django_redis import get_redis_connection
def index(request):
    # 去连接池中获取一个连接
    conn = get_redis_connection("default")
    conn.set('nickname', "武沛齐", ex=10)
    value = conn.get('nickname')
    print(value)
    return HttpResponse("OK")
View Code

写在最后

至此,就是本节的所有内容,大家可以在django中通过redis进行存取值,在后续的项目开发中可以用他来完成短信验证码过期的功能。

以后关于redis还会讲很多其他高级的知识点,参见:

 

posted @ 2022-08-04 06:11  silencio。  阅读(260)  评论(0编辑  收藏  举报