如何向django_芹菜添加自定义模型
我正在努力使芹菜适合高可用性,我已经完成了这个项目和这个项目,以便进行我需要的定制。芹菜链接显示对beat.py的修改,该修改使用以下代码: 我已将此锁模型添加到django_Cellery models.py文件中,并且能够很好地迁移:如何向django_芹菜添加自定义模型,django,python-2.7,celery,django-celery,Django,Python 2.7,Celery,Django Celery,我正在努力使芹菜适合高可用性,我已经完成了这个项目和这个项目,以便进行我需要的定制。芹菜链接显示对beat.py的修改,该修改使用以下代码: 我已将此锁模型添加到django_Cellery models.py文件中,并且能够很好地迁移: from django.db import models @python_2_unicode_compatible class Lock(models.Model): name = models.CharField(max_length=127, u
from django.db import models
@python_2_unicode_compatible
class Lock(models.Model):
name = models.CharField(max_length=127, unique=True)
created = models.DateTimeField(auto_now=True)
class Meta:
verbose_name_plural = _('locks')
def __str__(self):
return self.name
在utils文件夹的芹菜中,我添加了这个locked.py文件:
from djcelery.models import Lock
from datetime import datetime, timedelta
from django.db import transaction, IntegrityError
class Locked(object):
"""A context manager to add a distributed mutex."""
def __init__(self, name, timeout):
self.name = name
self.lock = None
self.timeout = timeout
def __enter__(self):
# first delete any expired locks
expired = datetime.utcnow() - timedelta(seconds=self.timeout)
Lock.objects.filter(name=self.name, created__lte=expired).delete()
# then try to get the lock
try:
Lock(name=self.name).save()
except IntegrityError:
transaction.rollback()
raise LockError('Could not acquire lock: {0}'.format(self.name))
def __exit__(self, *args):
Lock.objects.filter(name=self.name).delete()
class LockError(Exception):
"""Exception thrown when the requested lock already exists."""
pass
通过这些更改,我可以运行以下命令:
celery worker
python manage.py runserver
python manage.py shell
当我尝试运行计划程序时,我发出ARRIES:
celery beat
我得到以下错误:
Traceback (most recent call last):
File "venv/bin/celery", line 11, in <module>
load_entry_point('celery', 'console_scripts', 'celery')()
File "/venv/src/celery/celery/__main__.py", line 30, in main
main()
File "/venv/src/celery/celery/bin/celery.py", line 81, in main
cmd.execute_from_commandline(argv)
File "/venv/src/celery/celery/bin/celery.py", line 793, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/venv/src/celery/celery/bin/base.py", line 311, in execute_from_commandline
return self.handle_argv(self.prog_name, argv[1:])
File "/venv/src/celery/celery/bin/celery.py", line 785, in handle_argv
return self.execute(command, argv)
File "/venv/src/celery/celery/bin/celery.py", line 717, in execute
).run_from_argv(self.prog_name, argv[1:], command=argv[0])
File "/venv/src/celery/celery/bin/base.py", line 315, in run_from_argv
sys.argv if argv is None else argv, command)
File "/venv/src/celery/celery/bin/base.py", line 377, in handle_argv
return self(*args, **options)
File "/venv/src/celery/celery/bin/base.py", line 274, in __call__
ret = self.run(*args, **kwargs)
File "/venv/src/celery/celery/bin/beat.py", line 72, in run
beat = partial(self.app.Beat,
File "/venv/lib/python2.7/site-packages/kombu/utils/__init__.py", line 325, in __get__
value = obj.__dict__[self.__name__] = self.__get(obj)
File "/venv/src/celery/celery/app/base.py", line 572, in Beat
return self.subclass_with_self('celery.apps.beat:Beat')
File "/venv/src/celery/celery/app/base.py", line 504, in subclass_with_self
Class = symbol_by_name(Class)
File "/venv/lib/python2.7/site-packages/kombu/utils/__init__.py", line 96, in symbol_by_name
module = imp(module_name, package=package, **kwargs)
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/venv/src/celery/celery/apps/beat.py", line 19, in <module>
from celery import VERSION_BANNER, platforms, beat
File "/venv/src/celery/celery/beat.py", line 35, in <module>
from .utils.locked import Locked, LockError
File "/venv/src/celery/celery/utils/locked.py", line 1, in <module>
from djcelery.models import Lock
File "/venv/src/django-celery/djcelery/models.py", line 30, in <module>
class TaskMeta(models.Model):
File "/venv/lib/python2.7/site-packages/django/db/models/base.py", line 105, in __new__
app_config = apps.get_containing_app_config(module)
File "/venv/lib/python2.7/site-packages/django/apps/registry.py", line 237, in get_containing_app_config
self.check_apps_ready()
File "/venv/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
回溯(最近一次呼叫最后一次):
文件“venv/bin/芹菜”,第11行,在
加载入口点(“芹菜”、“控制台脚本”、“芹菜”)()
文件“/venv/src/cellery/cellery/_main__.py”,第30行,在main中
main()
文件“/venv/src/cellery/cellery/bin/cellery.py”,第81行,主文件
cmd.从命令行(argv)执行命令
文件“/venv/src/cellery/cellery/bin/cellery.py”,第793行,从命令行执行
超级(CeleryCommand,self)。从命令行(argv)执行命令)
文件“/venv/src/celery/celery/bin/base.py”,第311行,在执行命令行中
返回self.handle_argv(self.prog_名称,argv[1:])
文件“/venv/src/cellery/cellery/bin/cellery.py”,第785行,在handle_argv中
返回self.execute(命令,argv)
文件“/venv/src/celery/celery/bin/celery.py”,执行中第717行
).run_from_argv(self.prog_name,argv[1:],command=argv[0])
文件“/venv/src/cellery/cellery/bin/base.py”,第315行,从_argv运行
sys.argv(如果argv不是其他argv,则为命令)
文件“/venv/src/cellery/cellery/bin/base.py”,第377行,在handle_argv中
返回自我(*参数,**选项)
文件“/venv/src/cellery/cellery/bin/base.py”,第274行,在调用中__
ret=self.run(*args,**kwargs)
文件“/venv/src/cellery/cellery/bin/beat.py”,第72行,运行中
节拍=部分(self.app.beat,
文件“/venv/lib/python2.7/site packages/kombu/utils/_init__.py”,第325行,在__
value=obj.\uuuu dict\uuuu[self.\uuuuuu name\uuuuu]=self.\uuuuu get(obj)
文件“/venv/src/cellery/cellery/app/base.py”,第572行,节拍
返回self.subclass_和_self('芹菜.应用程序.节拍:节拍')
文件“/venv/src/cellery/cellery/app/base.py”,第504行,在子类_和_self中
类=符号按名称(类)
文件“/venv/lib/python2.7/site packages/kombu/utils/_init__.py”,第96行,符号为
模块=imp(模块名称,包=包,**kwargs)
文件“/usr/local/cillar/python/2.7.13/Frameworks/python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py”,第37行,在导入模块中
__导入(名称)
文件“/venv/src/cellery/cellery/apps/beat.py”,第19行,在
从芹菜进口版_横幅、平台、节拍
文件“/venv/src/cellery/cellery/beat.py”,第35行,in
from.utils.locked导入已锁定,锁定错误
文件“/venv/src/cellery/cellery/utils/locked.py”,第1行,在
从djcelery.models导入锁
文件“/venv/src/django芹菜/dj芹菜/models.py”,第30行,在
类TaskMeta(models.Model):
文件“/venv/lib/python2.7/site packages/django/db/models/base.py”,第105行,新__
app\u config=apps.get\u包含app\u config(模块)
文件“/venv/lib/python2.7/site packages/django/apps/registry.py”,第237行,在包含应用程序配置的get_中
self.check_apps_ready()
文件“/venv/lib/python2.7/site packages/django/apps/registry.py”,第124行,在check\u apps\u ready中
raise AppRegistryNotReady(“应用程序尚未加载。”)
django.core.exceptions.AppRegistryNotReady:尚未加载应用程序。
我的
安装的应用程序设置中有Django芹菜,所以我不知道这是怎么回事?芹菜经常与Django一起使用,并且与Django兼容,但它本身不是Django应用程序。您所做的修改是,当您运行芹菜节拍
时,会加载Django模型。为了为了能够使用模型,必须首先初始化应用程序。标准的方法是在设置之后调用,以便Django的代码可以找到Django设置。它可能类似于:
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
django.setup()
您需要将project.settings
更改为包含设置的实际模块名称。您必须指定要用于芹菜命令的应用程序实例
-应用程序,--APP=要使用的应用程序实例(例如module.attr_name)
例如,如果我有结构
pybilling
- pybilling
- celeryconfig.py
然后我应该开始用命令敲打芹菜
celery --app pybilling.celeryconfig:app beat
下面是celeryconfig.py的内容
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pybilling.settings')
from django.conf import settings # noqa
app = Celery('pybilling')
# 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)