Python ValueError:尚未提供以下参数:电子邮件

Python ValueError:尚未提供以下参数:电子邮件,python,flask,cron,apscheduler,Python,Flask,Cron,Apscheduler,我有以下途径,在POST请求时执行特定任务&将计数增加1 @blueprint.route("Calendar", methods=['GET', 'POST']) def Calendar(): count +=1 email = request.json.get('email') therestart(email) return email 我希望每个用户每24小时重置一次计数,因此我想到的最好方法是执行后台调度程序: import

我有以下途径,在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, trigger="interval", seconds=3) 
    scheduler.start()
def therestart(*args):
    if len(args)>0:
        email = args[0]
        user = User.query.filter_by(email=email).first()
        user.count = 0
    return 'no email'
然后,每当电子邮件被传递或激活时,
scheduler()
就会执行违背我目标的操作


如果有人能帮我摆脱这个困境,我将不胜感激。

您需要在目标函数中为email参数传递一个值。因此,您需要使用argskwargs来实现这一点。因此,您可以这样做:

def therestart(email):
    if email:
        scheduler()
def scheduler()
    scheduler = BackgroundScheduler()
    scheduler.add_job(func=therestart, trigger="interval", seconds=3) 
    scheduler.start()
def therestart(*args):
    if len(args)>0:
        email = args[0]
        user = User.query.filter_by(email=email).first()
        user.count = 0
    return 'no email'

您需要在目标函数中为email参数传递一个值。因此,您需要使用argskwargs来实现这一点。因此,您可以这样做:

def therestart(email):
    if email:
        scheduler()
def scheduler()
    scheduler = BackgroundScheduler()
    scheduler.add_job(func=therestart, trigger="interval", seconds=3) 
    scheduler.start()
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 ''
我最后做了:

def restart():
    users = User.query.all()
    for user in users:
        if user.stripeSubscriptionId is None:
            user.count = 1
            db.session.commit()
    return ''

谢谢你的帮助!我这样做并得到:
Traceback(最后一次调用):文件“/Users/Daniyal/Startup/Website/env/lib/python3.8/site packages/apscheduler/executors/base.py”,第125行,在run_job retval=job.func(*job.args,**job.kwargs)文件“/Users/Daniyal/Startup/Website/app/base/routes.py”,第464行,在restart email=args[0]索引器错误:元组索引超出范围
您已使用if电子邮件,对吗?因此,根据我的猜测,可能有一些情况下,你没有收到电子邮件。也许是因为索引错误即将来临。对于其中therestart func未获取任何电子邮件值的值。试着解决这个问题。否则,您必须以*args或**kwargs的形式传递电子邮件。每隔x秒,调度程序就会执行启动。只有当API被命中时,args才会包含任何值。当API未命中并且调度程序执行therestart func时,*args是一个空元组。即在执行*email=args[0]时,出现索引错误。我正在相应地编辑代码。感谢您的全面解决方案!这确实解决了问题。我最终使用了我自己发布的解决方案,因为它需要更少的依赖性和更少的行数。upvote后,我得到了“感谢反馈!记录了声誉低于15的人的投票,但不要更改公开显示的帖子分数。”感谢您的帮助!我这样做并得到:
Traceback(最后一次调用):文件“/Users/Daniyal/Startup/Website/env/lib/python3.8/site packages/apscheduler/executors/base.py”,第125行,在run_job retval=job.func(*job.args,**job.kwargs)文件“/Users/Daniyal/Startup/Website/app/base/routes.py”,第464行,在restart email=args[0]索引器错误:元组索引超出范围
您已使用if电子邮件,对吗?因此,根据我的猜测,可能有一些情况下,你没有收到电子邮件。也许是因为索引错误即将来临。对于其中therestart func未获取任何电子邮件值的值。试着解决这个问题。否则,您必须以*args或**kwargs的形式传递电子邮件。每隔x秒,调度程序就会执行启动。只有当API被命中时,args才会包含任何值。当API未命中并且调度程序执行therestart func时,*args是一个空元组。即在执行*email=args[0]时,出现索引错误。我正在相应地编辑代码。感谢您的全面解决方案!这确实解决了问题。我最终选择了我自己发布的解决方案,因为它需要更少的依赖性和更少的行数。upvote后,我得到“感谢反馈!记录了声誉低于15的人的投票,但不要更改公开显示的帖子分数。”