使用 Flask、Celery 和 Python 构建每月定时任务

在现代Web应用中,定时任务是常见的需求,比如发送月度报告、清理旧数据或执行定期备份。Python提供了多种工具来实现定时任务,其中Flask是一个轻量级的Web框架,Celery是一个强大的异步任务队列/作业队列,非常适合处理定时任务。本文将指导你如何结合使用Flask、Celery来创建每月运行的定时任务。

flask celery python 每月定时任务_redis

环境准备

首先,确保你的开发环境中安装了Python。然后,安装Flask和Celery以及它们所需的库:

pip install Flask Celery redis

这里我们使用Redis作为Celery的代理和消息代理。

创建 Flask 应用

创建一个新的Python文件,比如 app.py,并设置基础的Flask应用:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

集成 Celery

接下来,在你的Flask应用中集成Celery:

from celery import Celery

def make_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_RESULT_BACKEND'],
        broker=app.config['CELERY_BROKER_URL']
    )
    celery.conf.update(app.config)
    return celery

app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379/0',
    CELERY_RESULT_BACKEND='redis://localhost:6379/0'
)

celery = make_celery(app)

定义一个定时任务

使用Celery的@periodic_task装饰器来定义一个每月运行的任务:

from celery.schedules import crontab

@celery.task
def send_monthly_report():
    print('Sending monthly report...')
    # 这里添加发送报告的逻辑

# 每月初的1号运行任务
app.add_periodic_task(1, send_monthly_report.s(), schedule=crontab(day_of_month=1, hour=0, minute=0))

运行 Celery Worker

在你的项目目录下打开一个新的终端窗口,运行Celery worker:

celery -A app worker --loglevel=info

这将启动Celery worker,它将监听任务并执行它们。

运行 Flask 应用

回到你的Flask应用,现在你可以运行它:

python app.py

测试和验证

现在,你的应用已经设置好了每月定时任务。为了验证任务是否按计划执行,你可以在Flask应用中添加一个路由来触发Celery任务:

@app.route('/trigger-task')
def trigger_task():
    send_monthly_report.apply_async()
    return 'Task has been triggered!'

访问 /trigger-task 路由,你将看到控制台输出 "Sending monthly report...",这意味着任务正在执行。

总结

通过结合使用Flask和Celery,你可以轻松地在Python Web应用中实现复杂的定时任务。Celery的灵活性和强大的定时任务支持,使得它成为处理周期性任务的理想选择。记得监控你的任务执行情况,并根据需要调整任务的调度计划。