利用celery+django 在admin后台设置定时任务

经常用python开发web应用时,会涉及到定时任务的脚本,以前用linux自带的crontab来操作,但是感觉不太接地气,后来发现用celery+django 可以方便的实现!

安装软件环境如下:

python 2.7.5

Django==1.8.2

celery==3.1.18

celery-with-redis==3.0

django-celery==3.1.16

MySQL-python==1.2.3

supervisor==3.1.3

使用pip方式安装完以上软件,并且默认系统已经安装了redis和mysql服务器!

一 首先创建project:

django-admin.py createproject picha

然后创建名称为demo的app:

django-admin.py startapp demo

项目的目录结构为:

二 下面在settings文件中配置celery相关的配置:

# CELERY STUFF
import djcelery
djcelery.setup_loader()
BROKER_URL = ‘redis://localhost:6379‘
CELERYBEAT_SCHEDULER = ‘djcelery.schedulers.DatabaseScheduler‘ # 定时任务
CELERY_RESULT_BACKEND = ‘djcelery.backends.database:DatabaseBackend‘
CELERY_RESULT_BACKEND = ‘redis://localhost:6379‘
CELERY_ACCEPT_CONTENT = [‘application/json‘]
CELERY_TASK_SERIALIZER = ‘json‘
CELERY_RESULT_SERIALIZER = ‘json‘
CELERY_TIMEZONE = ‘Asia/Shanghai‘
INSTALLED_APPS = (
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘demo‘,
    ‘djcelery‘,
)

然后修改市区:

TIME_ZONE = ‘Asia/Shanghai‘

市区不对,计划任务是不会按时间执行的!

另外,我们还需要在创建一个celery.py文件,他会自动发现我们app下面的task!

#! /usr/bin/env python
# coding: utf-8

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

# set the default Django settings module for the ‘celery‘ program.
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘picha.settings‘)
app = Celery(‘picha‘)

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object(‘django.conf:settings‘)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
    print(‘Request: {0!r}‘.format(self.request))

现在我们在demo的app下面创建测试用的task!

from __future__ import absolute_import
from celery import shared_task,task

@shared_task()
def add(x,y):
    # return x + y
    print x + y

@shared_task()
def mul(x,y):
    print "%d * %d = %d" %(x,y,x*y)
    return x*y

@shared_task()
def sub(x,y):
    print "%d - %d = %d"%(x,y,x-y)
    return x - y

@task(ignore_result=True,max_retries=1,default_retry_delay=10)
def just_print():
    print "Print from celery task"

到这里,django和celery部分已经安装完成!

三 我现在开始配置supervisor,用来启动相关celery程序:

1)初始化supervisor配置文件!

echo_supervisord_conf > /etc/supervisord.conf

2)然后在supervisord.conf文件末尾添加如下配置:

[program:djangoproject.celeryd]
command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celeryd --concurrency=1
user=root
numprocs=1
directory=/usr/local/coding/pythoner/picha
stdout_logfile=/var/log/celery_worker.log
stderr_logfile=/var/log/celery_worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 120
priority=998

[program:djangoproject.celerybeat]
command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celery beat --schedule=/tmp/celerybeat-schedule --pidfile=/tmp/django_celerybeat.pid --loglevel=INFO
user=root
numprocs=1
directory=/usr/local/coding/pythoner/picha
stdout_logfile=/var/log/celery_beat.log
stderr_logfile=/var/log/celery_beat.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 120
priority=998

[program:djangoproject.celerycam]
command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celerycam --frequency=10.0
user=root
numprocs=1
directory=/usr/local/coding/pythoner/picha
stdout_logfile=/var/log/celerycam.log
stderr_logfile=/var/log/celerycam.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 120
priority=998

四 现在我们需要把celery相关的库文件同步到mysql中,我们使用命令:

python manage.py syncdb

然后创建superuser

django-admin manage.py createsuperuser

启动supervisor:

supervisord -d

查看服务是否启动成功,使用命令supervisorctl status

djangoproject.celerybeat         RUNNING   pid 3061, uptime 1:03:27

djangoproject.celerycam          RUNNING   pid 3063, uptime 1:03:27

djangoproject.celeryd            RUNNING   pid 3062, uptime 1:03:27

然后我们进入到django-admin后台,

现在我们启动django:

python manage.py runserver 0.0.0.0:8008

进入后台后,点击“Periodic tasks”:

可以看到写在tasks.py下面的方法,在下拉菜单中都出现了,我们只用选择对应的时间即可!

现在,我们开始选择计划任务的时间:

我们创建一个定时任务,没10s,print一个数值,放在在日志文件中查看:

我们查看日志文件:

符合我们在web后台的设置!

我们在设置一个加法运算,每隔15s运行一次,而且我们可以在web平台后端动态的修改所传的参数,

第一次,我们传入参数9和5,结果应该为14,我们看下设置和日志:

我再看下日志:

然后我们在web后台修改传入参数为10和7,不重启服务,计算的结果动态变化为17!

我们发现,结果数据已经动态变化!

我们如果启动了 supervisor脚本中的:/usr/local/coding/pythoner/picha/manage.py celerycam --frequency=10.0

就可以在admin后台查看 woker是不是在线:

celery-django相关的配置就完成了!

PS:配置过程中计划任务的结果只能日志中查看,不知道怎么在admin的后台中显示,如果大家知道,可以告诉我,3Q!

时间: 2024-10-13 00:22:02

利用celery+django 在admin后台设置定时任务的相关文章

自定义路由组件,Django的admin后台管理,DRF的三大认证,jwt认证

目录 一.自定义路由组件 1. 为什么要自定义路由组件 2. 自定义路由组件实例 二.Django的admin后台管理 三.DRF的三大认证组件概括 1. 认证组件 2. 权限组件 3. 频率组件 四.Django中的用户权限管理 五.jwt认证 1. jwt认证和普通session认证的区别 2. jwt认证介绍 (1)jwt的原理 (2)jwt三部分的内容 3. jwt的签发算法 (1)第一步:头部算法 (2)第二步:载荷部分的算法 (3)第三步:签名部分的算法 (4)第四步:连接生成tok

Django的admin后台

ModelAdmin对象 ModelAdmin类的简单使用 该ModelAdmin是在管理界面模型的表示.通常这些文件存储在admin.py应用程序中命名的文件中.让我们来看一个示例ModelAdmin: from django.contrib import admin from myproject.myapp.models import Author class AuthorAdmin(admin.ModelAdmin): pass admin.site.register(Author, Au

第四章:Django模型——admin后台管理

1. 通过 Django自带的admin 后台来管理用户,管理刚刚创建的 发布会表和嘉宾表 打开文件位置:sign/admin.py 文件 2. 在 admin.py 文件中将 发布会表和嘉宾表 添加到 admin 中. 3.  访问 admin 地址: http://localhost:8000/admin  需要登陆用户名和密码:admin/adminadmin

django的admin后台注册model并显示

在admin后台注册model并显示其他字段: 修改app下的admin.py,注册model: from .models import vmadmin.site.register(vm) #注册名为vm的model 在admin后台会显示vm内容,但是默认只显示model中return的字段: 比如要显示名为hv的model中的其他字段,修改admin.py如下: from .models import hv,vm admin.site.register(vm) class hvAdmin(a

django 之admin后台管理

数据库 1 from django.db import models 2 from django.contrib.auth.models import User 3 from django.contrib.auth.models import ( 4 BaseUserManager, AbstractBaseUser,PermissionsMixin 5 ) 6 from django.utils.translation import ugettext_lazy as _ 7 from djan

继续完成昨天的第一个点:更改DJANGO的ADMIN后台的表单显示

遇到的问题是MANYTOMANY的选项太多,默认的DJANGO一个多选框搞得人蛋疼, 于是作了一个扩展,不是最好的,但方便多啦.. 也是在昨天说过的各个app的admin.py里操作: from django.forms import CheckboxSelectMultiple # Register your models here. class SiteForm(forms.ModelForm): class Meta: forms.model = Site widgets = { 'app

django的admin简单使用

新建完项目之后,我们是可以直接访问admin后台的,django不会为我们生成任何的登录用户,但django为我们提供了一个方法来创建用户:进入run manage.py task下,creatsuperuser 然后回车,然后输入用户名和密码,这样就完成了超级用户的建立,我们就可以使用这个用户去登录django的admin后台. 登录进入之后,我们会发现系统是全英文的,我们可以通过修改setting.py来切换成中文的 LANGUAGE_CODE = 'zh-hans' #中文 1.8版本之后

django-19.admin后台自定义显示

前言 django的admin后台默认显示的内容很少,只显示了表的相关信息,查看字段内容需点开详情才能查看,不是很直观.在admin.py文件里面是可以自定义相关的展示内容的,也可以添加搜索框,快速的搜索相关内容 优化列表显示 django的表信息列表显示默认值显示了表的相关属性 如果我们想让表里面的字段内容全部显示出来,需在admin.py文件添加list_display 属性,相关代码如下 # admin.py from django.contrib import admin from he

django-18.admin后台中文版

前言 django的admin后台页面默认是英文的,不喜欢英文的话,可以改下setting.py里面的语言设置,改成中文版的显示 语言设置 打开setting.py,找到以下内容 # Internationalization # https://docs.djangoproject.com/en/2.1/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = T