Django定时任务之django_apscheduler使用

Django定时任务之django_apscheduler使用

今天在写一个任务需求时需要用到定时任务来做一部分数据处理与优化,于是在了解完现有方法,结合自己需求决定使用django_apscheduler,记录一下过程,有几篇值得参考的文章放在结尾,很多本文未提到之处可详见参考文章。
1、安装插件

bash 复制代码
pip install django-crontab

2、添加至settings中

bash 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_apscheduler', # 这里
    ...
]

3、migrate一下

bash 复制代码
python manage.py migrate

会多出两个表,记录定时任务及执行

4、写定时任务,可以直接写在已有app的views.py文件中,也可以自己新建一个app,放在新建app的views.py文件中,不过有一点需要注意,就是views.py文件得在api中引用才行,否则定时任务无法执行

1)若是写在已有app的views.py文件中,可以直接复制以下代码进行测试

python 复制代码
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job

# 实例化调度器
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
# 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")

@register_job(scheduler, "interval", seconds=5, id="test_func", replace_existing=True, misfire_grace_time=120)
def test_func():
    print('test')

scheduler.start()

2)新建app,这里我新建了一个timedtasks的app,以下是view.py文件的内容,分别有三个job,可以供测试

python 复制代码
# Create your views here.

from django.http import HttpResponse
import time
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_job, register_events

import logging
logger = logging.getLogger('apps')

# 实例化调度器
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
# 调度器使用DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), "default")

logger.info('django-apscheduler')


# 1.通过 @register_job 类装饰器做法 每间隔5s执行一次
@register_job(scheduler, "interval", seconds=5, args=['job1name'], id='job1', replace_existing=True)
def job1(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

def job2(name):
    # 具体要执行的代码
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

def job3(name):
    print('{} 任务运行成功!{}'.format(name, time.strftime("%Y-%m-%d %H:%M:%S")))

# 2.add_job的方式 interval 每间隔10s执行一次
scheduler.add_job(job2, "interval", seconds=10, args=['job2name'], id="job2", replace_existing=True)

# 3.add_job的方式 crontab 16点 38分/40分 执行
scheduler.add_job(job3, 'cron', hour='16', minute='38,40', args=['job3name'], id='job3', replace_existing=True)

# 监控任务
register_events(scheduler)
# 调度器开始运行
scheduler.start()


# 注:必须得注册到API中去才可以,不然定时任务不能注册,不能执行
def testTimedTasks(request):
    return HttpResponse('ok')

注意,urls.py文件中得引用:

python 复制代码
from apps.timedtasks.views import testTimedTasks
urlpatterns = [
	...,
    path("test-timed-tasks/", testTimedTasks, name="test-timed-tasks"),
]

简单记录一下流程,如有错误欢迎指正,如有补充欢迎评论!

【参考】https://blog.csdn.net/weixin_42782150/article/details/123212604

【参考】https://blog.csdn.net/hans99812345/article/details/123926503

【参考】https://www.cnblogs.com/leisunny/p/16185169.html

相关推荐
catoop17 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
Web极客码17 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
库库的数据库笔记17 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
姚远Oracle ACE18 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss27318 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss27318 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
Henry-SAP19 小时前
SAP PP模块全景概览
数据库
喜欢吃豆20 小时前
Better Auth 深度解析:从用户认证到企业级身份基础设施
数据库·架构·权限·多租户
其实防守也摸鱼20 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全