9
votes

Django boucle d'importation entre les tâches de céleri et mes modèles

J'utilise le céleri avec mon projet Django.

Dans le fichier Tâches de céleri, j'ai besoin d'importer mes modèles afin de déclencher des méthodes de modèle. Cependant, j'aimerais aussi que mon modèle puisse déclencher certaines tâches de céleri.

À l'heure actuelle, j'importe mes modèles au céleri, cependant essayant d'importer des tâches de céleri dans mon fichier de modèles entraîne une erreur de boucle d'importation et d'importation.

Quelle est la bonne façon d'aller à ce sujet?


0 commentaires

4 Réponses :


1
votes

L'approche générale pour résoudre ces problèmes de dépendance circulaire apparemment est de facturer un code pouvant être importé à la fois par les modèles et les tâches. Par exemple, vous pouvez prendre en compte les méthodes de modèle que vous mentionnez. Vos modèles importeraient ce code sur les prises en charge, et les tâches pourraient ainsi.


0 commentaires

9
votes

Qu'est-ce que j'ai fini par faire, utilise les importations dans les méthodes, au lieu d'une importation générale en haut du fichier Modèles. De toute évidence, je n'avais pas vraiment besoin d'importations circulaires. Mon problème était que j'importais le modèle en haut du fichier Tâches de céleri et l'importation des tâches de céleri en haut du fichier de modèles. Ce n'était pas vraiment nécessaire. En compartimenant les importations, j'ai pu éviter le problème d'importation circulaire


2 commentaires

Cette approche a été mentionnée généralement en réponse à la même question sur la liste des utilisateurs de Django: Groupes.google.com/forum / #! Topic / django-users / 1MI7LGXWGVK


C'est en fait une conception de module assez médiocre - Je ne sais pas la taille de votre codeBase, cependant, vous commencerez à fonctionner dans de vrais problèmes si vous adoptez ce comportement partout dans votre basebase. Vous voudrez peut-être revenir à ce que vous souhaitez que vos modèles fassent de vos tâches à faire - quelles tâches de céleri souhaitez-vous que votre modèle puisse déclencher?



1
votes

Que diriez-vous de ne pas utiliser d'un fichier Tâches.py et de votre application des décorateurs de tâches aux méthodes de modèles.py?


2 commentaires

Un inconvénient de cette approche est que cela contribue à l'encontre de ce qui est recommandé dans les "premières étapes avec Django" de la Céleri Docs, par ex. "Avec la ligne située au-dessus du céleri découvrira automatiquement des tâches dans des applications réutilisables si vous suivez les tâches.Pary convention ..." (de docs.celeryproject.org/en/latest/django/... )


Qui est pire cependant? Ne tenant compte de la recommandation ou de faire les importations dans les méthodes? La décoration ne sera-t-elle pas découverte de toute façon?



4
votes

célery fournit la méthode send_task () code>, ce qui permet d'envoyer une tâche par nom, éliminant ainsi la nécessité d'importer - par exemple:

# models.py
from celery import current_app
# no need to import do_stuff from tasks because it will be sent by name

current_app.send_task('myapp.tasks.do_stuff', args=(1, 'two'), kwargs={'foo': 'bar'})


0 commentaires