我需要使用以下命令更新计划中的solr索引:
(env)$ ./manage.py update_index
我查看了Celery文档并找到了关于调度的信息,但是还没能找到一种方法来按计划和virtualenv内部运行django管理命令。这会更好地在正常的cron上运行吗?如果是这样,我将如何在virtualenv中运行它?有人有这方面的经验吗?
感谢您的帮助!
答案 0 :(得分:3)
Django Celery任务计划 项目结构
[appname]/
├── [appname]/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── celery.py
│ └── wsgi.py
├── [project1]/
│ ├── __init__.py
│ ├── tasks.py
│
└── manage.py
在 settings.py 文件中添加以下配置:
STATIC_URL = '/static/'
BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis'
from celery.schedules import crontab
CELERY_TIMEZONE = 'UTC'
celery.py :保存celery任务计划程序
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
import django
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appname.settings')
from django.conf import settings
app = Celery('appname')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
**#scheduler**
app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'project1.tasks.cleanup',
'schedule': 30.0,
'args': ()
},
}
app.conf.timezone = 'UTC'
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']
tasks.py from project1
from celery import shared_task
import celery
import time
from django.core import management
@celery.task#(name='cleanup')
def cleanup():
try:
print ("in celery module")
"""Cleanup expired sessions by using Django management command."""
management.call_command("clearsessions", verbosity=0)
#PUT MANAGEMENT COMMAND HERE
return "success"
except:
print(e)
任务将每30秒运行一次
窗口要求
芹菜工作者和芹菜节拍应该正在运行 在不同的终端上运行以下每个命令
芹菜-appname工作者-l信息
芹菜-应用名称击败-l信息
Linux的要求:
芹菜工作者和芹菜节拍应该正在运行 芹菜节拍和工作人员可以在同一服务器上启动
芹菜-A应用程序名称工作者-l信息-B
@tzenderman,如果我错过了什么,请告诉我。 对我来说,这很好
答案 1 :(得分:0)
要从cron作业定期运行命令,只需将命令包装在加载virtualenv的bash脚本中。例如,以下是我们运行manage.py命令的方法:
django_cmd.sh:
#!/bin/bash
cd /var/www/website/
source venv/bin/activate
/var/www/website/manage.py $1 --settings=$2
crontab的:
MAILTO=webmaster@website.com
SETTINGSMODULE=website.settings_prod
5 * * * * /var/www/website/django_cmd.sh update_index $SETTINGSMODULE >> /dev/null
0 10 * * * /var/www/website/django_cmd.sh update_accounts $SETTINGSMODULE
答案 2 :(得分:0)
我实际上找到了一种使用面料+芹菜的好方法,我现在正在研究它:
在app / tasks.py中,使用您需要的manage.py命令创建一个fabric函数,然后使用@periodic_task
进行装饰,将其添加到您的芹菜计划中,这应该是好的。
更新:我无法实际使用Fabric + Celery,因为在模块中使用fabric会导致它被识别为结构文件,并且文件中的芹菜调用无效。