• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共46篇

    python3.X - Web - Flask1.1.1

关闭

返回栏目

关闭

返回python3.X - Web - Flask1.1.1栏目

40 - Flask - 扩展 - Flask-APScheduler - 定时任务

作者:

贺及楼

成为作者

更新日期:2024-10-28 18:09:45

Flask - 扩展 - Flask-APScheduler - 定时任务

Flask-APScheduler 库的简介

Python 的 Flask-APScheduler 是一个 Flask 扩展库,它集成了 APScheduler,一个高级的 Python 定时任务框架。以下是 Flask-APScheduler 的一些主要作用和特点:

  1. 集成定时任务:可以在 Flask 应用中轻松地添加和管理定时任务,例如定时发送邮件、定期执行数据库备份等。
  2. 支持多种触发器:支持基于时间间隔、cron 表达式等多种触发方式来执行任务。
  3. API 管理:提供了 RESTful API 来管理和监控定时任务,包括任务的添加、删除、暂停和恢复等操作。
  4. 配置灵活性:可以通过 Flask 的配置系统来配置任务,包括任务存储、执行器、API 权限验证等。
  5. 持久化支持:支持将任务存储在不同的存储系统中,如数据库、内存等,确保任务的持久化。
  6. 自动启动和关闭:在 Flask 应用启动时自动加载和启动任务,在应用关闭时自动关闭任务。
  7. 线程安全:API 是线程安全的,可以在 Flask 应用的任何部分安全地调度和管理任务。
  8. 认证支持:可以为 API 提供认证,以确保只有授权用户才能管理定时任务。
  9. 时区支持:支持设置时区,以确保定时任务在正确的时间执行。
  10. 错误处理:提供了错误处理机制,可以对任务执行过程中的异常进行捕获和处理。

Flask-APScheduler 适用于需要在 Flask 应用中实现定时任务的场景,如定期数据更新、定时报告生成等。通过使用 Flask-APScheduler,开发者可以更加方便地管理和维护应用中的定时任务。

pip安装Flask-APScheduler

  1. pip install Flask-APScheduler

pip安装Flask-APScheduler

包中文名 释义 跳转
Flask-APScheduler==1.13.1 / /
├── APScheduler [required: >=3.2.0,<4.0.0, installed: 3.10.4] / APScheduler是一个Python库,用于在应用程序中添加定时任务和作业调度功能。 /
│ ├── pytz [required: Any, installed: 2024.2] / pytz是Python的时区处理库,支持现代和历史时区信息,包括夏令时调整。 /
│ ├── six [required: >=1.4.0, installed: 1.16.0] / python的six库是一个用于处理 Python 2 和 Python 3 兼容性问题的工具库。 /
│ └── tzlocal [required: >=2.0,!=3.*, installed: 5.2] / tzlocal是一个Python库,用于自动检测并使用本地时区。 /
├── Flask==3.0.3 / 主包 /
│ ├── blinker [required: >=1.6.2, installed: 1.8.2] / blinker 是一个小巧的 Python 库,用于实现对象之间的信号传递。 /
│ ├── click [required: >=8.1.3, installed: 8.1.7] / Click是一个Python库,用于创建命令行界面,支持装饰器语法,易于创建命令行应用程序。 /
│ ├── itsdangerous [required: >=2.1.2, installed: 2.2.0] / itsdangerous是一个Python库,用于安全地传递信任数据,支持签名和加密,常用于Web应用中的会话管理和数据验证。 /
│ ├── Jinja2 [required: >=3.1.2, installed: 3.1.4] / Jinja2是一个现代且设计友好的Python模板引擎,广泛用于Web应用开发。 Flask - 扩展 - jinja2 - 模版处理信息 - {{}}
│ │ └── MarkupSafe [required: >=2.0, installed: 2.1.5] / MarkupSafe 是一个 Python 库,用于安全地处理和转义 HTML 和 XML 标记。 /
│ └── Werkzeug [required: >=3.0.0, installed: 3.0.4] / Werkzeug是Python的WSGI工具包,用于开发Web应用程序,提供请求、响应对象和中间件。 /
│ └── MarkupSafe [required: >=2.1.1, installed: 2.1.5] / MarkupSafe 是一个 Python 库,用于安全地处理和转义 HTML 和 XML 标记。 /
└── python-dateutil [required: >=2.4.2, installed: 2.9.0.post0] / python-dateutil是一个Python库,提供强大的日期和时间处理功能。 /
└── six [required: >=1.5, installed: 1.16.0] / 同上 /

init.py

  1. from apscheduler.schedulers.background import BackgroundScheduler
  2. from flask_apscheduler import APScheduler
  3. import atexit
  4. import fcntl # 只能用于linux
  5. scheduler = APScheduler(BackgroundScheduler(timezone="Asia/Shanghai")) # 定时任务 - 初始化

init.py的create_app()加2条

  1. def create_app():
  2. ......
  3. db.app = app # APScheduler实现数据库
  4. db.init_app(app) # 数据库,原本就有的
  5. configure_scheduler(app)

init.py加configure_scheduler(app)方法
加个锁

  1. def configure_scheduler(app):
  2. """Configure Scheduler"""
  3. f = open("scheduler.lock", "wb")
  4. try:
  5. fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
  6. scheduler.init_app(app) # 定时任务 - 把任务列表放入 flask
  7. scheduler.start() # 定时任务 - 启动任务列表
  8. except:
  9. pass
  10. def unlock():
  11. fcntl.flock(f, fcntl.LOCK_UN)
  12. f.close()
  13. atexit.register(unlock)

xxx.py加装饰器

  1. @scheduler.task('interval',minutes=5)
  2. @scheduler.task('cron',hour=23,minute=17)
  3. def xxx():
  4. from app import create_app
  5. app = create_app()
  6. with app.app_context():
  7. xxx # 可以数据库搜索
  8. xxx # 可以使用aap.config

3种方式:
1、date 一次性指定固定时间,只执行一次
run_date(str)– 精确时间
‘run_date’: ‘2021-3-21 17:30:30’

2、interval 间隔调度,隔多长时间执行一次
weeks (int) – 间隔几周
days (int) – 间隔几天
hours (int) – 间隔几小时
minutes (int) – 间隔几分钟
seconds (int) – 间隔多少秒
start_date (datetime|str) – 开始日期
end_date (datetime|str) – 结束日期

3、cron 指定相对时间执行,比如:每月1号、每星期一执行
year (int|str) – 年,4位数字
month (int|str) – 月 (范围1-12)
day (int|str) – 日 (范围1-31)
week (int|str) – 周 (范围1-53)
day_of_week (int|str) – 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – 时 (范围0-23)
minute (int|str) – 分 (范围0-59)
second (int|str) – 秒 (范围0-59)
start_date (datetime|str) – 最早开始日期(包含)
end_date (datetime|str) – 最晚结束时间(包含)

因为没有上下文,所以调用create_app
修改生效:要ctrl + C 完全切断,再重启才行

uwsgi加上

  1. enable-threads=true # 允许程序内部启动多线程,为定时器
  2. preload=true # 用--preload启动uWSGI,确保scheduler只在loader的时候创建一次,为定时器
  3. lazy-apps=true