问题描述
我有以下路由,根据 POST 请求执行某个任务并将计数增加 1。
@blueprint.route("Calendar",methods=['GET','POST'])
def Calendar():
count +=1
email = request.json.get('email')
therestart(email)
return email
我想根据每个用户每 24 小时重置一次计数,所以我想到的最好方法是执行后台调度程序:
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
def therestart(email):
if email:
user = User.query.filter_by(email=email).first()
user.count = 0
return 'no email'
scheduler = BackgroundScheduler()
scheduler.add_job(func=therestart,trigger="interval",seconds=200) #change to 86400 sec in prod
scheduler.start()
出现错误:
ValueError: The following arguments have not been supplied: email
这是有道理的,但同时,如果我要把它改成这样:
def therestart(email):
if email:
scheduler()
def scheduler()
scheduler = BackgroundScheduler()
scheduler.add_job(func=therestart,seconds=3)
scheduler.start()
然后每次通过或激活电子邮件时,scheduler()
都会执行这与我的目标背道而驰的操作。
如果有人能让我摆脱这种困境,我将不胜感激。
解决方法
您需要在目标函数中为 email 参数传递一个值。因此,您需要为此使用 args 或 kwargs。因此,您可以执行以下操作:
def therestart(*args):
if len(args)>0:
email = args[0]
user = User.query.filter_by(email=email).first()
user.count = 0
return 'no email'
,
我最终做了:
def restart():
users = User.query.all()
for user in users:
if user.stripeSubscriptionId is None:
user.count = 1
db.session.commit()
return ''