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
SECRET_KEY = "i9490kl*(780990HGjhsoid7872378287mn,,.,ghghY!@3"
PERMANENT_SESSION_LIFETIME = timedelta(days=3)
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['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"
ACCESS_KEY_SECRET = "11"
class SMS:
def __init__(self,signName,templateCode):
self.signName = signName
self.templateCode = templateCode
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')
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;
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();
$.post("/send/",{'phone':phone,'csrf_token':csrf},function (data) {
console.log(data)
})
})
</script>