阿里云短信验证码(可以直接向客服发送 短信验证码 就会出来教程):
- 在“产品与服务”中搜索“短信”进入短信服务
(2 3 4 需要进入 短信服务管理在控制台) - 获取AccessKey (点击左侧 概览 看右侧的AK)
- 签名管理:申请签名(左侧 国内消息)
- 模板管理:设置模板(左侧 国内消息)
- 下载发送短信Python SDK(下载的压缩包为:dysms_python.zip,不是openjdk之类的)
- 进入到dysms_python的下载目录,进行解压
- 对于发送短信,dysms_python目录中demo_sms_sned.py aliyunsdkdybaseapi和aliyunsdkysmsapi三个文件最重要,可以单独存放。
- pip install aliyun-python-sdk-core-v3
- 我的示例代码(存在session的问题,解决请看下一个示例):
如果有前端代码,可以讲下列的代码作为后台。如果没有,可以 修改下面的手机号,直接访问5007端口对应的route
# -*- coding: utf-8 -*-
import os,sys
import flask
from flask import Flask
import socket
from flask import request
from flask import redirect
from flask import make_response,render_template
from flask import Flask, render_template, jsonify
from random import *
from dateutil.parser import parse
import random
import datetime
import json
from flask_cors import CORS
import sys
from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
from aliyunsdkdysmsapi.request.v20170525 import QuerySendDetailsRequest
from aliyunsdkcore.client import AcsClient
import uuid
import json
from aliyunsdkcore.profile import region_provider
from aliyunsdkcore.http import method_type as MT
from aliyunsdkcore.http import format_type as FT
import const
import random
from flask import session
#from utils.captcha import Captcha
"""
短信业务调用接口示例,版本号:v20170525
Created on 2017-06-12
"""
app = Flask(__name__,static_folder = "./dist/static",template_folder = "./dist")
app.config['SECRET_KEY'] = 'XXXX'
app.secret_key = 'why would I tell you my secret key?'
CORS(app, resources=r'/*')
app.permanent_session_lifetime = datetime.timedelta(seconds=5*60)
try:
reload(sys)
sys.setdefaultencoding('utf8')
except NameError:
pass
except Exception as err:
raise err
# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"
#阿里大鱼相关配置
ACCESS_KEY_ID = '你的AK的id'
ACCESS_KEY_SECRET = '你的AK的sercet'
SING_NAME = "签名名称"
TEMPLATE_CODE = "模板code"
acs_client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
def send_sms(phone_numbers, template_param=None):
smsRequest = SendSmsRequest.SendSmsRequest()
# 申请的短信模板编码,必填
smsRequest.set_TemplateCode(TEMPLATE_CODE)
# 短信模板变量参数
if template_param is not None:
smsRequest.set_TemplateParam(template_param)
# 设置业务请求流水号,必填。
business_id = uuid.uuid1()
smsRequest.set_OutId(business_id)
# 短信签名
smsRequest.set_SignName(SING_NAME)
# 数据提交方式
# smsRequest.set_method(MT.POST)
# 数据提交格式
# smsRequest.set_accept_format(FT.JSON)
# 短信发送的号码列表,必填。
smsRequest.set_PhoneNumbers(phone_numbers)
# 调用短信发送接口,返回json
smsResponse = acs_client.do_action_with_exception(smsRequest)
# TODO 业务处理
return smsResponse
@app.route('/send', methods=['GET', 'POST'])
def send():
#mobile=request.json['mobile']
mobile="你要测试的手机号"
res={}
res['status']=1
#radom_code = Captcha.gene_text(6)
sss=random.randint(1000,9999)
print(sss)
params = {'code': sss}
if send_sms(mobile, params):
session[mobile]= sss #把手机号码作为key
return json.dumps(res)
else:
res['status']=0
return json.dumps(res)
@app.route('/code_sure',methods=['POST','GET'])
def code_sure():
#mobile=request.json['mobile']
#code=request.json['code']
mobile="你要测试的手机号"
code="你要测试的验证码"
code_true=session.get(mobile)
res={}
if(code==code_true):
if(code):
res['status']=1
return json.dumps(res)
res['status']=0
return json.dumps(res)
@app.route('/regist',methods=['POST','GET'])
def regist():
usrid=request.json['usrid']
password=request.json['password']
res={}
res['status']=1
return json.dumps(res)
if __name__ == '__main__':
# print(__business_id)
#params = {
# 'code': 1234
#}
# params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
#print(send_sms("15563116059", json.dumps(params)))
hostname = socket.gethostname()
ip='0.0.0.0'
app.run( host=ip,port=5000,debug=False )
解决发送验证码时,session获取不到数据
问题描述:我将验证码存到以手机号为key的session中,并设置验证时间为5分钟。存入之后,立刻取出数据,可以获取到,但是在更换路由之后获取不到。
解决:在了解session的机制之后,明白了。解释如下:flask的session类似字典,可以通过键值对存储在服务器,但是其实flask的session是返回到客户端的!!!服务器端只有session的id!!!用于客户端的session再次返回到服务器时,进行比对,防止session混淆。而我的问题就在于,session跟着返回客户端,但是下次客户端访问服务器的时候,session没有跟着回来。在客户端,对session添加身份凭证withCredentials:true就可以
handleRegist() {
if (!this.mobile || !this.code) {
this.$vux.toast.text('请填验证码')
} else {
var data = {'mobile': this.mobile, 'code': this.code}
this.$axios.post('http://xxxx.xxxx.xxxx.xxxx:5007/code_sure', data, {withCredentials: true}).then(res => {
if (res.data.status == 1) {
this.$router.push({
path: '/Regist_2',
name:'Regist_2',
query: {
id: this.mobile
}
})
} else {
alert(res.data.status)
}
}
)
}
},
但是问题又来了,我是前后端分离,这样修改之后,后台只能收到访问通知,然后什么都接收不到,啧啧啧,当然是cors又又又又又出错了,修改如下
#CORS(app, resources=r'/*')
CORS(app, supports_credentials=True)
mongodb数据库,
这个没啥…百度搜搜就可以…记得studio 3t一定要备份!!!