Je viens de commencer à implémenter des écouteurs de signal dans un projet django. Bien que je comprenne ce qu'ils sont et comment les utiliser. J'ai du mal à trouver où je devrais les mettre. La documentation du site django dit ceci:
Vous pouvez mettre la gestion du signal et le code d'enregistrement où vous le souhaitez. Cependant, vous devrez vous assurer que le module dans lequel il se trouve est importé tôt afin que la gestion du signal soit enregistrée avant que des signaux ne soient envoyés. Cela fait de models.py de votre application un bon endroit pour enregistrer les gestionnaires de signaux.
Bien que ce soit une bonne suggestion, avoir des classes ou des méthodes non modèles dans mon models.py me frotte dans le mauvais sens.
Alors, quelle est la meilleure pratique / règle pour stocker et enregistrer les gestionnaires de signaux?
la source
Foo
qui fait partie defooapp
. Mais le récepteur de signal est une extension et vit dans une application différente (par exempleotherapp
).Cela a été ajouté à la documentation lors de la sortie de Django 1.7 :
La meilleure pratique consiste à définir vos gestionnaires dans handlers.py dans un sous-module de signaux, par exemple un fichier qui ressemble à:
yourapp / signaux / handlers.py :
Le meilleur endroit pour enregistrer votre gestionnaire de signaux est alors dans l'AppConfig de l'application qui le définit, en utilisant la méthode ready () . Cela ressemblera à ceci:
yourapp / apps.py :
Assurez-vous que vous chargez votre AppConfig en le spécifiant soit directement dans votre INSTALLED_APPS settings.py, soit dans le
__init__
de votre application. Voir la documentation ready () pour plus d'informations.Remarque: si vous fournissez également des signaux à d'autres applications pour les écouter, placez-les
__init__
dans votre module de signaux, par exemple un fichier qui ressemble à:votreapp / signaux / __ init__.py
Une autre application peut alors écouter votre signal en l'important et en l'enregistrant, par exemple
from yourapp.signals import task_generate_pre_save
. Séparer vos signaux de vos gestionnaires permet de garder les choses propres.Instructions pour Django 1.6:
Si vous êtes toujours bloqué sur Django 1.6 ou une version antérieure, vous feriez la même chose (définissez vos gestionnaires dans votre application / signaux / handlers.py) mais plutôt que d'utiliser AppConfig, vous chargeriez les gestionnaires via le __init__.py de votre application, par exemple quelque chose comme:
votreapp / __ init__.py
Ce n'est pas aussi agréable que d'utiliser la méthode ready () car cela provoque souvent des problèmes d'importation circulaire.
la source
__init__
importer des signaux ne fonctionnerait pas pour moi, donc je me demande s'il y a un autre endroit d'où je pourrais importer des signaux jusqu'à ce que nous soyons prêts à passer à une version ultérieure de django.from . import handlers
(ou similaire)yourapp/signals/__init__.py
?yourproject.
dans la dernière ligne du bloc de code de classe TaskConfig. Cela fonctionne avec exactement cette structure, alors considérez ceci qa :)Je viens juste de rencontrer cela, et comme mes signaux ne sont pas liés au modèle, j'ai pensé ajouter ma solution.
J'enregistre diverses données autour de la connexion / déconnexion, et je devais me connecter
django.contrib.auth.signals
.J'ai mis les gestionnaires de signaux dans un
signals.py
fichier, puis__init__.py
j'ai importé des signaux à partir du fichier de module, car je pense que cela est appelé dès que l'application démarre (le test avec uneprint
instruction suggère qu'elle est appelée avant même que le fichier de paramètres ne soit lu.)et dans signaux.py
Je suis assez nouveau sur Django (/ python), donc je suis ouvert à quiconque me dit que c'est une idée terrible!
la source
user_logged_in.connect(on_logged_in)
devrait probablement passer l'dispatch_uid
argument. Plus d'informations sur docs.djangoproject.com/en/dev/topics/signals/… .Je viens de lire cet article sur les meilleures pratiques en matière de présentation de vos projets / applications, et il suggère que tous vos signaux de répartiteur personnalisés doivent être placés dans un fichier appelé
signals.py
. Cependant, cela ne résout pas complètement votre problème, car vous devez toujours les importer quelque part, et plus ils sont importés tôt, mieux c'est.La suggestion de modèle est bonne. Puisque vous avez déjà tout défini dans votre
signals.py
fichier, cela ne devrait pas prendre plus d'une ligne en haut du fichier. Ceci est similaire à la façon dont leadmin.py
fichier est présenté (avec les définitions de classe en haut et le code d'enregistrement de toutes les classes d'administration personnalisées en bas), si vous définissez vos signaux, connectez-les dans le même fichier.J'espère que cela pourra aider! En fin de compte, cela dépend de ce que vous préférez.
la source
signals.py
fichier, mais je ne savais pas comment il devait être appelé par la suite. En l'important dans monmodels.py
fichier, j'ai obtenu une solution très propre, sans "polluer" mon fichier models.py. Je vous remercie! :)models.py et signaux.py dans chaque application ont été les endroits recommandés pour connecter les signaux, cependant, ils ne sont pas la meilleure solution, à mon avis, pour garder les signaux et les gestionnaires répartis. La distribution devrait être la raison pour laquelle les signaux et les gestionnaires ont été inventés dans django.
J'ai lutté pendant longtemps et nous avons finalement trouvé la solution.
créer un module de connecteur dans le dossier de l'application
donc nous avons:
dans app / connecteurs.py, nous avons défini des gestionnaires de signaux et les avons connectés. Un exemple est fourni:
puis dans models.py, nous ajoutons la ligne suivante à la fin du fichier:
Tout est fait ici.
De cette façon, nous pouvons placer les signaux dans signaux.py et tous les gestionnaires dans connecteurs.py. Pas de gâchis dans les modèles et les signaux.
J'espère que cela fournit une autre solution.
la source
Je les garde dans un fichier séparé
signals.py
,models.py
après que tous les modèles soient définis. Je les importe et je connecte des modèles à des signaux.signaux.py
models.py
Cela me fournit une séparation logique, bien sûr, il n'y a rien de mal à les conserver dans models.py , mais c'est plus gérable de cette façon.
J'espère que cela t'aides!!
la source
Petit rappel à propos de
AppConfig
. N'oubliez pas de définir:la source