Django/djcelery 1.8.2 AppRegistryNotReady: Translation infrastructure cannot be initialized

1k views Asked by At

I am getting the following error:

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.

I have a project which is not really a django app but a celery app. Therefore, I have not created a wsgi.py or models.py or any of the typical files created by django-admin when a project or app is started.

I only want to use djcelery to be able to create periodic tasks using the djcelery.schedules.DatabaseScheduler like specified here Add, modify, remove celery.schedules at run time and here How to dynamically add / remove periodic tasks to Celery (celerybeat)

The solution to the problem as given here (AppRegistryNotReady, translation bug when deploying with uWSGI) requires me to make changes to vassal.ini file. There is no vassal.ini file in my implementation.

I will briefly describe my proj -

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'),
        }
    }

Before I run the workers I created the required tables using the django-admin migrate command. I can see the tables in the /home/test.db database.

First I run the workers - $python apps.py Then I save a schedule to the database to be executed repeatedly by celerybeat daemon - $python runproj.py

1

There are 1 answers

0
Olerdrive On

As it is said in django documentation, if you run your django app as a standalone one, you should ensure all the steps of the initialization process to be done by yourself:

setup()

This function is called automatically:

  • When running an HTTP server via Django’s WSGI support.

  • When invoking a management command.

It must be called explicitly in other cases, for instance in plain Python scripts.

In your case it would be is as simple as call 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')

Also, your settings module (celeryconfig.py) should be treated as a python code, so you have to import all of the used objects (Queue and Exchange from kombu and the os module).

And contain django-required settings. Add a SECRET_KEY in your celeryconfig.py file:

from kombu import Exchange, Queue
import os


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
SECRET_KEY = "YOUR_TOP_SECRET_KEY"

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'),
    }
}