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
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:
In your case it would be is as simple as call
django.setup()
:Also, your settings module (
celeryconfig.py
) should be treated as a python code, so you have to import all of the used objects (Queue
andExchange
fromkombu
and theos
module).And contain django-required settings. Add a
SECRET_KEY
in yourceleryconfig.py
file: