0

我正在使用 Flask 构建 API,我需要检查是否已跳过并向他们发送邮件以自动跳过,但是使用我的方法服务器将无法启动,我需要在 API 运行时检查是否跳过,而我可以访问所有路由但是服务器甚至没有启动。有什么办法吗?提前致谢

def check_skipped():
    users = User.query.all()
    for user in users:
        if user.skipped == 3:
            msg = Message("Skipped 3 times", sender="admin@Kill3r.tech", recipients=user.email)
            msg.body = 'Open app and verify now'
            mail.send(msg)

schedule.every(10).seconds.do(check_skipped)

while 1:
    schedule.run_pending()
    time.sleep(1)

@app.route('/user', methods=['GET'])
@token_required
def get_all_users(current_user):
4

2 回答 2

1

首先,我假设您实际上在某个地方启动了服务器,但是您的问题是 while 循环,当您启动它时,while 循环始终在运行,直到程序停止的那一刻,这意味着。如果您通过程序查看计算机的工作方式(按从上到下的顺序),您将看到在 while 循环结束后创建了您的路线,但在您的情况下,一旦 while 循环结束,程序就意味着您可以' t 访问这些路由。您应该查看threading标准库,以便可以同时使用多个线程,一个用于电子邮件,一个用于网站。

或者您可以将它们放入单独的文件中。但我认为你需要退后一步,多看看 python 来了解一下 while 循环。

所以简而言之

您的 while 循环开始,一直运行直到程序被杀死,然后就是这样。您的路线永远不会被创建。

要停止这种情况,请使用多个线程,或将它们放入单独的文件中。但是,在您为您的网站编写必要的代码之前,永远不要有一个 while 循环。

于 2020-05-26T18:53:09.930 回答
0

你不能像这样在你的路线之间放置while循环,它会冻结程序,因为它没有条件停止。也许看看这个答案

使用那个答案,我认为你可以用这个替换你的while循环。

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()
scheduler.add_job(func=check_skipped, trigger="interval", seconds=10)
scheduler.start()

我不认为它会冻结程序,但我不确定。另外,我还不知道很多烧瓶约定,所以我不知道把它放在哪里最好,我认为在声明你的路线后把它放在某个地方会很好。

编辑:我意识到我不确定你的schedule实例是什么。如果它是一些自定义类,您可以使用
scheduler.add_job(func=schedule.run_pending, trigger="interval", seconds=10)

于 2020-05-26T18:46:33.530 回答