9
votes

Possible de changer d'ordre des signaux Django?

J'ai 2 signaux envoyés à l'enregistrement de l'utilisateur, socialauth_registered et post_save. J'aimerais que Socialauth_registered précède Post_save, car il affecte la fonction post_save déclencheurs.

est-ce possible? (Et si c'est le cas, comment?!) P>

Je ne suis pas sûr de ce qui est pertinent, mais j'ai: P>

from django.contrib.auth.models import User
from social_auth.signals import socialauth_registered, pre_update
from django.db.models.signals import post_save

<ALL OF MY MODELS>

def create_user_profile(sender, instance, created, **kwargs):
    do some stuff

def create_social_profile(sender, user, response, details, **kwargs):
    do other stuff

socialauth_registered.connect(create_social_profile, sender=None)
post_save.connect(create_user_profile, sender=User)


0 commentaires

4 Réponses :


10
votes

Je ne suis pas positif, mais je dirais que c'est douteux. Un peu important est que l'idée derrière les signaux est qu'ils devraient être atomiques. Un gestionnaire de signal doit répondre au signal et ne devrait pas se soucier d'autres signaux. S'appuyant sur l'ordre de deux signaux non liés (évidemment, vous pouvez compter sur l'ordre de pré_save et post_save par exemple) n'est pas sûr en général. Donc, même si je n'ai pas de réponse ferme sur votre question, j'offrerais que vous devriez réfléchir avec précaution sur la conception.


1 commentaires

Merci pour le conseil. J'ai fini par sauvegarder l'idée de signal et j'ai essayé une approche différente qui est définitivement supérieure. Bien que vous ne répondiez pas explicitement à la question, vous m'avez dit que ce n'était pas la bonne question à demander, ce qui était probablement la meilleure réponse que j'aurais pu obtenir!



0
votes

Avez-vous envisagé d'utiliser un signal qui appelle créer_social_profile et créer_user_profile. Peut-être que vous pourriez attacher ce signal à post_save?


1 commentaires

Malheureusement non. Le post_save est déclenché à chaque fois qu'un objet utilisateur est créé pendant que le socialautheh_registered n'est déclenché que lorsqu'un utilisateur enregistre via une tierce partie. Pour les utilisateurs réguliers, nous confirmons les e-mails, cela n'est pas nécessaire pour les utilisateurs de Socialauth, nous aimerions donc l'empêcher de se produire. Idéalement, l'inscription régulière déclencherait que Post_Save et l'enregistrement social déclencheraient socialautheuth_register.



15
votes

Non, vous ne pouvez pas modifier l'ordre que les signaux sont exécutés.

La priorité du signal a été proposée, mais les développeurs de base ont déclaré qu'ils n'étaient pas implémenter cette fonctionnalité:

https://code.djangoproject.com/ticket/16547


1 commentaires

Cela devrait être la bonne réponse. Bien que le marqué ait plus de contenu, c'est la définitive.



3
votes

Je sais que c'est une très vieille question, mais j'ai été surpris par le manque de tout ce que j'ai trouvé lié à une solution de contournement pour le commandement du gestionnaire. Donc, voici une sous-classe du répartiteur qui implémente les priorités.

from django.dispatch import Signal as BaseSignal
from django.dispatch.dispatcher import _make_id


class Signal(BaseSignal):

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None, priority=50):
        if dispatch_uid is None:
            dispatch_uid = _make_id(receiver)

        inner_uid = '{0}{1}'.format(priority, dispatch_uid)
        super(Signal, self).connect(receiver, sender=sender, weak=weak, dispatch_uid=inner_uid)
        self.receivers.sort()


0 commentaires