如何在Django中设置定时任务的方法示例
作者:BigYoung 发布时间:2023-03-21 06:19:07
Django 作为后端Web开发框架,有时候我们需要用到定时任务来或者固定频次的任务来执行某段代码,这时我们就要用到Celery了。Django中有一个中间件:Django-celery
环境:
Python 3.6
Django为小于1.8版本
Celery为3.1版本
第一步安装:django-celery
pip install django-celery
第二步:配置celery和任务
创建测试django环境:
django-admin.py createproject test
django-admin.py startapp demo
创建好的项目布局如下:
- proj/
- manage.py
- proj/
- __init__.py
- celery.py
- settings.py
- urls.py
- demo/
- migrations
- __init__.py
- admin.py
- apps.py
- models.py
- tasks.py
- tests.py
- views.py
2.1 配置celery.py文件
需要替换的内容,我都在对应的行后提示了,剩下的内容默认就好
创建test/test/celery.py文件,内容如下:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') # “proj.settings”替换为你的项目信息:test.settings
app = Celery('proj') # 这里的proj替换为你的项目名称:test
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
2.2 配置项目的init.py中配置celery内容
打开test/test/__init_.py文件,添加内容:
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
2.3 在task.py中添加计划任务
编辑test/demo/task.py文件,添加计划任务,内容如下:
# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def xsum(numbers):
return sum(numbers)
第三步:任务执行
运行django项目: python manage.py runserver
3.1 后台添加计划任务
访问“http://localhost:8000/admin/”,在celery的管理页面里,选择Periodic tasks,进行任务添加。选择对应的任务,设置定时或者周期时间
3.2 启动定时的celery服务
注意:celery依赖redis服务,需要提前运行redis服务:`redis-server`
# 以下两个命令在不同的shell窗口里执行,需要在django的目录下
python manager.py celery beat -l info #接收定时任务的命令
python manager.py celery worker -l info #执行定时任务的命令,此shell窗口会看到任务的输入信息
3.3 启动单次的celery服务
注意:celery依赖redis服务,需要提前运行redis服务:`redis-server`
python manager.py shell # 进到django的shell里
from demo.task import mul, xsum # 导入task任务
a = mul()
b = xsum()
# 执行a, b会输出信息
a(1,2)
b(1)
PS:django-crontab实现Django定时任务
django-crontab安装:
pip install django-crontab
django-crontab加入:只需要将django-crontab加入到settings.py的INSTALLED_APPS即可。如下代码:
INSTALLED_APPS = (
'django_crontab',
...
)
django-crontab配置:settings.py中加入django-crontab的命令即可:
CRONJOBS = [
('47 11 * * *', 'django.core.management.call_command', ['closepoll'],{},'>> /var/run.log'),
]
格式:
参数1:定时 例如47 11 * * * 表示每天的11时47分执行
参数2:方法的python模块路径,如果执行django-admin命令,则写django.core.management.call_command
参数3:方法的位置参数列表(默认值:[]),如果执行django-admin命令,则填写所需执行的命令,例如我们在polls中已经定义过的closepoll
参数4:方法的关键字参数的dict(默认值:{})
参数5:执行log存放位置(即重定向到文件,默认:'')
django-crontab任务加载:
django-crontab任务加载比较简单,只需要运行 python manage.py crontab add 即可
查看已经激活的任务使用 python manage.py crontab show
删除已经有的任务使用 python manage.py crontab remove
如果你修改了任务记得一定要使用 python manage.py crontab add 这个会更新定时任务
来源:http://www.bigyoung.cn/1096.html
猜你喜欢
- 不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的。当数据量大的时候是必须考虑的。之前
- MySQL中SQL Mode的查看与设置MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql
- 本文实例讲述了codeigniter发送邮件并打印调试信息的方法。分享给大家供大家参考。具体如下:这里的codeigniter代码实现发送邮
- 一、私有化上篇说过封装,既将我们不想让别人看到代码的内容,但是又需要用到的内容,通过类内部调用来实现调用。说到这里却不得不提一下上篇的:cl
- 有时候会需要通过从保存下来的ckpt文件来观察其保存下来的训练完成的变量值。ckpt文件名列表:(一般是三个文件)xxxxx.ckpt.da
- 新建一个Spring Initializr项目2.把pom.xml文件中的oracle依赖换成自己的oracle版本依赖:原来的:现在的:
- 这里使用FSO对象来删除指定文件夹 代码和说明如下:<% set fs=createobject(&qu
- 本文实例讲述了Python实现的读取文件内容并写入其他文件操作。分享给大家供大家参考,具体如下:文件目录结构,如图:read_file.py
- 最近分别用vue和Android实现了一个券码复制功能,长按券码会在上方弹出一个拷贝的icon提示,点击icon将券码内容复制到剪贴板。现将
- ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料,发现其中提供
- 具体代码如下所示:<?php//在子类或类内部用“::”调用本类或父类时,不是静态调用方法,而是范围解析操作符。class Paren
- 有时,希望除去某些记录或更改它们的内容。DELETE 和 UPDATE 语句令我们能做到这一点。用update修改记录UPDATE tbl_
- 用于逐行分析文本的代码示例fileIN = open(sys.argv[1], "r")line = fileIN.re
- 在 Python 中,我们可以使用基本的索引操作来获取数组中的元素。然而,有时候我们需要获取一个数组的子数组,也就是只获取数组中的一部分元素
- 第一种情况是返回的游标是某个具体的表或视图的数据,如:SQL-Code:CREATE OR REPLACE P
- 1、将python打包好的exe解压为py文件,步骤如下: 下载pyinstxtractor.py文件2、下载地址:https://nchc
- 1、代码from aip import AipFaceimport cv2import timeimport base64from PIL
- 页面域关系:主页面a.html所属域A:www.aspxhome.com被iframe的页面b.html所属域B:www.cidianwan
- 特点python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置
- 一、图图:数据(张量Tenrsor)+ 操作(节点Operation) (静态)图可以用:1、默认图;2、自定义图。1、默认图查看默认图的方