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

问题描述

我有以下路由,根据 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 参数传递一个值。因此,您需要为此使用 argskwargs。因此,您可以执行以下操作:

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 ''

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...