添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

经常用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相关的配置:

# 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
# 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))

三 我现在开始配置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

查看服务是否启动成功,使用命令 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一个数值,放在在日志文件中查看:

我们查看日志文件:

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

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

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

我再看下日志:

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

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

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

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

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

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

在admin.py文件中声明:❤️ manage的startapp命令在创建post应用的时候会自动创建admin.py文件,想要把自定义的Model注册到管理后台,就需要在这个文件中进行声明: 用户反馈管理功能,是对前端用户反馈的问题进行展示,并可实现删除功能。是一个很实用的功能,也算是当代网站的标配。它可以实时的跟踪到用户对网站的各种意见和吐槽,开发者能及时修缮网站功能或者修改网站bug。 本讲我们会讲到一些关于发邮件的技术。我们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会通过后台给用户发送网站最新的一些动向,一般是通过邮件来发送的。当你阅读完本节内容,会对发邮件的流程有一个大概的了解。 照例我们先添加评论管理的相关路由 path('comment_list/', views.CommentListView.as_view(), name='comment_list'), path('comment_delete/', views.comment_delete, name='comment_delete'), 首先是评论列表的展示,我们通过CommentListView视图类来实现,该类依然是继承ListView来实现的。 从本讲开始,我们开始视频管理功能的开发,视频管理包括视频上传、视频列表、视频编辑、视频删除。另外还有视频分类的功能,会一同讲解。这一讲非常重要,因为你将学习到一些之前没有学过的技术,比如大文件上传技术。 从本讲起,我们会介绍后台管理系统的开发,后台管理,主要是对数据库中的数据进行增、删、改、查的操作,满足网站管理员对网站的管理与维护的需求。 其实,django自带的也有一个后台管理系统(/admin),但是自带的后台非常简陋,无论是界面,还是功能上,都无法满足用户的需求,因此,我们自己开发了一套后台管理系统。