2017-03-05 1 views
0

Je suis le tutoriel sur here pour obtenir les tâches périodiques définies dans mon projet django.Django-Celery: importation d'une autre application dans le fichier célery.py du projet

L'article suggère d'avoir un fichier celery.py de la forme:

from celery import Celery 
    from celery.schedules import crontab 

    app = Celery() 

    @app.on_after_configure.connect 
    def setup_periodic_tasks(sender, **kwargs): 
      # Calls test('hello') every 10 seconds. 
      sender.add_periodic_task(10.0, my_task.s('hello'), name='add every 10') 
      ) 

    @app.task 
    def my_task(arg): 
      print(arg) 

qui fonctionne. Maintenant c'est bien mais je ne veux pas définir mes tâches localement. Ma question est, comment puis-je ajouter des tâches à partir d'autres applications? J'ai créé un projet vide appelé my_proj et il a deux applications: my_proj et app_with_tasks. le fichier celery.py ci-dessus est au niveau racine dans le répertoire de l'applicationet je souhaite ajouter des tâches périodiques à partir du fichier tasks.py de app_with_tasks.

J'ai app_with_tasks répertoriés dans des applications installées dans le fichier de paramètres pour my_proj mais je ne peux toujours pas à importer quoi que ce soit à partir d'une application à anthères.

je crois comprendre que je devrais utiliser:

from app_with_tasks.tasks import task1 

mais my_proj montrera ensuite référence non résolue dans PyCharm.

+0

Quelle est la commande que vous utilisez pour démarrer le serveur/démon céleri? – jperelli

+0

'celery -A my_proj beat', mais je n'y suis pas encore. Je crois que j'ai manqué une étape triviale car nulle part dans mes fichiers de projet je ne peux faire une importation de quelque chose à partir de l'application 'app_with_tasks'. – ShS

Répondre

1

Je vais vous dire ce que j'utilise. Peut-être qu'il vous aide à

my_proj/celery.py

import os 
import celery 

# set the default Django settings module for the 'celery' program. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') 

app = celery.Celery('app_django') 

app.config_from_object('django.conf.settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

puis à app_with_tasks, ajouter le fichier tasks.py

from my_proj.celery import app 
from django.apps import apps 

@app.task(bind=False) 
def your_task(some_arg): 
    A_Model = apps.get_model('my_proj', 'A_Model') 
    .... 
commande

pour démarrer le serveur de céleri (redémarrer chaque fois que vous modifiez une tâche pour recharger des fichiers tasks.py)

/path/to/virtualenv/bin/celery --app=my_proj.celery:app --loglevel=INFO --concurrency=4 -n default_worker worker 

Pour appeler la tâche (vous devez utiliser votre add_perio code dic_task)

from app_with_tasks.tasks import your_task 
your_task.apply_async(args=[123], kwargs=None) 
+0

Merci pour votre aide. Alors j'ai pensé que j'allais ignorer les avertissements de Pycharm et courir le truc de céleri de toute façon et étrangement, il bat en fait comme avant. Donc je suppose que le problème n'était pas vraiment le côté céleri des choses. C'est Pycharm ne reconnaissant pas les imorts pour une raison quelconque. – ShS

+0

Je pense que les choses importantes à regarder sont '--app = my_proj.celery: app' et' autodiscover_tasks'. Vous devez dire à pycharms d'utiliser 'my_proj.celery: app'. Voir http://stackoverflow.com/questions/37150910/how-can-i-use-pycharm-to-locally-debug-a-celery-worker – jperelli

+0

J'utilise actuellement @shared_tasks ce qui signifie que je n'ai pas besoin de lier mes tâches à l'instance de l'application (google it) Comme je l'ai dit, mes problèmes ne sont pas vraiment avec des tâches en tant que telles. l'EDI ne reconnaît pas 'app_with_tasks' pour commencer! – ShS