flask7 短信验证码

该博客详细介绍了如何在Flask应用中设置短信验证码功能,涵盖了从配置settings到创建views、SMS模块以及forms和register.html模板的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

app

from flask import Flask
from flask_script import Manager
from App.views import bp

app = Flask(__name__)
app.config.from_pyfile("settings.py")
manager = Manager(app)

# 注册蓝图
app.register_blueprint(bp)

if __name__ == '__main__':
    manager.run()

settigns

from datetime import timedelta

# 签名加密,session使用
SECRET_KEY = "i9490kl*(780990HGjhsoid7872378287mn,,.,ghghY!@3"
# session存活时间
PERMANENT_SESSION_LIFETIME = timedelta(days=3)
# session是否持久存储
PERMANENT = True

App.views

from random import randint
from flask import Blueprint, render_template, request, session, make_response, redirect, jsonify, current_app
from App.SMS import sms
from App.forms import RegisterForm

bp = Blueprint("bp",__name__)

@bp.route("/",methods=["GET","POST"])
def index():
    return 'ok'

# 短信验证
@bp.route("/send/",methods=["GET","POST"])
def send_sms():
    phone = request.values.get('phone')
    print(phone)
    if phone:
        # 产生验证码
        num = randint(1000,9999)
        # 添加到session
        session['sms'] = str(num)
        para = "{'number':'%d'}" % num
        res = sms.send(phone,para)
        print(res,type(res))
        return jsonify({'code':1,'msg':'发送成功'})
    return jsonify({"code":0,'msg':"电话号码不存在"})

# 用户注册
@bp.route("/register/",methods=['GET','POST'])
def register_user():
    form = RegisterForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            print(form)
            return redirect('/')
    return render_template("register.html",**locals())

App.SMS

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest

ACCESS_KEY_ID = "11"  #用户AccessKey  需要根据自己的账户修改
ACCESS_KEY_SECRET = "11"  #Access Key Secret  需要根据自己的账户修改

class SMS:
    def __init__(self,signName,templateCode):
        self.signName = signName  #签名
        self.templateCode = templateCode  #模板code
        self.client = client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, 'cn-hangzhou')

    def send(self,phone_numbers,template_param):
        request = CommonRequest()
        request.set_accept_format('json')
        request.set_domain('dysmsapi.aliyuncs.com')
        request.set_method('POST')
        request.set_protocol_type('https')  # https | http
        request.set_version('2017-05-25')
        request.set_action_name('SendSms')

        request.add_query_param('RegionId', "cn-hangzhou")
        request.add_query_param('PhoneNumbers', phone_numbers)
        request.add_query_param('SignName', self.signName)
        request.add_query_param('TemplateCode', self.templateCode)
        request.add_query_param('TemplateParam', template_param)
        response = self.client.do_action_with_exception(request)
        return response
# 短语发送对象
sms = SMS("成少雷","SMS_102315005")

App.forms

from flask import session
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import Regexp, ValidationError


class RegisterForm(FlaskForm):
    phone = StringField(validators=[Regexp(r'^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$')])
    sms = StringField()

    # 字段验证
    def validate_sms(self,field):
        print(field.data,session.get("sms"))
        if field.data != session.get("sms"):
            raise ValidationError("短信验证失败")

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{{ url_for('bp.register_user') }}" method="post">
    {{ form.csrf_token }}
    手机号: <input type="tel" name="phone" id="phone">
    {% for error in form.phone.errors %}
        <span>{{ error }}</span>
    {% endfor %}
    <br>
    <input type="text" name="sms"> <input type="button" value="发送验证码" id="send">
     {% for error in form.sms.errors %}
        <span>{{ error }}</span>
    {% endfor %}
    <br>
    <input type="submit">
</form>
</body>
</html>
<script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script>
     $("#send").click(function () {
        num = 5;
        $(this).attr('disabled',true);
        $(this).prop('value',""+num+"秒后发送");
        let _this = this;  //this表示当前按钮
        var timer = setInterval(function () {
            num -= 1;
            if (num <0){
                $(_this).attr('disabled',false);
                $(this).prop('value',"发送验证码")
                return
            }
            $(_this).prop('value',""+num+"秒后发送");
            console.log(num)
        },1000);
        let phone = $("#phone").val();
        let csrf = $("[name='csrf_token']").val();
        // 发送短信验证码
        //ajax
        $.post("/send/",{'phone':phone,'csrf_token':csrf},function (data) {
            console.log(data)
        })

    })
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值