在create_app.py文件里配置相关数据
from flask import Flask
from flask_cors import CORS
from model.model import db
from views.user_bp import user_bp
from views.news_bp import news_bp
# BackgroundScheduler 后台运行
# BlockingScheduler 阻塞运行
from apscheduler.schedulers.background import BackgroundScheduler
# from apscheduler.schedulers.blocking import BlockingScheduler
def create_app(config):
flask_app = Flask(__name__)
flask_app.config.from_object(config)
flask_app.register_blueprint(user_bp)
flask_app.register_blueprint(news_bp)
# 实例化调度器
scheduler = BackgroundScheduler()
# 把调度器添加到flask核心对象上,方便全局调用
flask_app.scheduler = scheduler
# 启用调度器
flask_app.scheduler.start()
cors = CORS(flask_app)
db.init_app(flask_app)
return flask_app
user_bp.py
import random
import json
import time
import jwt
import redis
from flask import Blueprint, jsonify, current_app
from flask_restful import reqparse, Resource, Api
from ronglian_sms_sdk import SmsSDK
user_bp = Blueprint("user_bp", __name__, url_prefix="/user")
api = Api(user_bp)
# 定义工作 注意此函数里面要使用上下文 就需要手动开启上下文
def sms_code(mobile):
time.sleep(3)
from app import app
# with app.app_context():
with app.test_request_context():
accId = current_app.config.get("ACC_ID")
accToken = current_app.config.get("ACC_TOKEN")
appId = current_app.config.get("APP_ID")
tid = current_app.config.get("TID")
code = random.randint(1000, 9999)
res = redis.Redis(host="127.0.0.1", port=6379, password="123456")
res.set("sms_%s" % mobile, code)
res.close()
sdk = SmsSDK(accId, accToken, appId)
resp = sdk.sendMessage(tid, mobile, (code, "5"))
resp = json.loads(resp)
if resp:
return jsonify({
"code": 200,
"msg": "验证码发送成功"
})
else:
return jsonify({
"code": 400,
"msg": "验证码发送失败"
})
class TaskView(Resource):
def get(self):
# 把需要异步的工作添加到调度器中即可
req = reqparse.RequestParser()
req.add_argument("mobile")
args = req.parse_args()
mobile = args["mobile"]
current_app.scheduler.add_job(sms_code, args=[mobile])
return jsonify({
"code": 200,
"msg": "执行成功"
})
api.add_resource(TaskView, "/task")