Django / djcelery 1.8.2 AppRegistryNotReady:无法初始化翻译基础设施

时间:2015-06-11 21:28:58

标签: python django celery celerybeat djcelery

我收到以下错误:

File "/Library/Python/2.7/site-packages/Django-1.8.2-py2.7.egg/django/utils/translation/trans_real.py", line 164, in _add_installed_apps_translations
"The translation infrastructure cannot be initialized before the "
django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.

我有一个项目,它不是一个真正的django应用程序,而是一个芹菜应用程序。因此,在项目或应用启动时,我没有创建wsgi.pymodels.pydjango-admin创建的任何典型文件。

我只想使用djcelery来使用djcelery.schedules.DatabaseScheduler创建定期任务,例如Add, modify, remove celery.schedules at run time和此处How to dynamically add / remove periodic tasks to Celery (celerybeat)

此处给出的问题解决方案(AppRegistryNotReady, translation bug when deploying with uWSGI)要求我对vassal.ini文件进行更改。我的实现中没有vassal.ini文件。

我将简要介绍一下我的项目 -

proj
  apps.py
  tasks.py
  celeryconfig.py
  runproj.py
  • apps.py
    from celery import Celery
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryconfig')
    myapp = Celery('myapp')
    myapp.config_from_object('celeryconfig')
    if __name__ == '__main__'
        myapp.worker_main('-B', '-S', 'djcelery.schedules.DatabaseScheduler')
  • tasks.py
    from apps import myapp
    @myapp.task(name='msgprinter')
    def msg_printer(msg):
        print msg
  • runproj.py
    from djcelery.models import PeriodicTask, IntervalSchedule
    intSch = IntervalSchedule(period='seconds', every=30)
    periodic_task = PeriodicTask(
      name = 'msg_printer_schedule',
      task = 'proj.tasks.msg_printer',
      interval = intSch,
      args=json.dump(['such wow']),
     )
    periodic_task.save()
  • celeryconfig.py
    CELERY_ACCEPT_CONTENT = ['pickle', 'json']
    BROKER_URL = 'amqp://guest@localhost'
    CELERY_IMPORTS = ('proj.tasks')
    CELERY_QUEUES = [Queue('default', Exchange('default', type='direct'), routing_key='default')]

    #DJANGO SETTINGS
    INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djcelery',
    'mypp')

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join('/home', 'test.db'),
        }
    }

在运行worker之前,我使用django-admin migrate命令创建了所需的表。我可以在/home/test.db数据库中看到这些表。

首先我运行工人 - $python apps.py 然后我将一个计划保存到数据库,由celerybeat守护程序重复执行 - $python runproj.py

1 个答案:

答案 0 :(得分:0)

如django文档中所述,如果您以独立的方式运行django应用,则应确保initialization process的所有步骤都由您自己完成:

  

setup()

     

此功能会自动调用:

     
      
  • 通过Django的WSGI支持运行HTTP服务器时。

  •   
  • 调用管理命令时。

  •   
     

在其他情况下,例如在纯Python脚本中,必须显式调用它。

对于您来说,这就像调用django.setup()一样简单:

from celery import Celery
import django
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryconfig')
myapp = Celery('myapp')
myapp.config_from_object('celeryconfig')

if __name__ == '__main__'
    django.setup()
    myapp.worker_main('-B', '-S', 'djcelery.schedules.DatabaseScheduler')

此外,您的设置模块(celeryconfig.py)应该被视为python代码,因此您必须从{{1}导入所有使用的对象(QueueExchange }和kombu模块)。

并包含django所需的设置。在您的os文件中添加一个SECRET_KEY

celeryconfig.py