flask7 短信驗證碼

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章