Код создания профиля пользователя Django выполняется дважды - почему? - PullRequest
3 голосов
/ 15 апреля 2011

Используя Django 1.2, я запускаю приложение django-registration и создаю объект профиля пользователя после регистрации, создавая пользователя - используя код, полученный из некоторых других Вопросов:

# models.py
def create_player_profile(sender, instance, created, **kwargs):
    signals.post_save.disconnect(create_player_profile, sender = User) # added.
    if created:
        print "creating profile."
        profile, created = PlayerProfile.objects.get_or_create(user = instance)
        print "profile %s created = %s" % (str(profile), str(created))
    else:
        print "problems creating profile."

signals.post_save.connect(create_player_profile, sender = User)

И все работает нормально :) Единственная проблема в том, что я получаю два набора вывода, указывающих, что код выполняется дважды . Я подозреваю, что по какой-то причине сигнал отправляется дважды.

Первая мысль: файл получает импортированный дважды, устанавливая два одинаковых сигнала. Что заставляет меня задуматься, может быть, django-registration делает что-то автоматически? Или что-то еще, что я еще не понимаю о Джанго. :)

Так почему код выполняется дважды? Отправляются ли два сигнала, и если да, то почему?

Обновление Только что заметил Этот ответ объяснил, как избежать дублирования сигналов. И это сработало, несколько :) Мой вывод пошел от:

создание профиля.
создание профиля.
проблемы при создании профиля
проблемы при создании профиля

до:

создание профиля.
проблемы при создании профиля

Я не знаю, означает ли это, что мой код изначально выполнялся четыре раза ? И выпал только два раза? Я весьма озадачен. :)

Обновление 2 - добавлена ​​строка signal.disconnect . Я полагал, что удаление сигнала предотвратит выполнение функции дважды. Увы, я был неправ - create-player-profile это все еще , работающий дважды ... Я понятия не имею, почему, если сигнал был немедленно удален.

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Обновление : убрал этот материал о AUTH_PROFILE_MODULE

Так почему код выполняется дважды? Являются два сигнала отправляются, и если да, почему?

Думаю, проблема не в том, что сигнал вызывается дважды, а в том, что ваш метод User.save() вызывается дважды где-то (и, следовательно, также и в отношении сигнала). Может быть, вам следует сначала проверить это.

0 голосов
/ 21 октября 2014

Это также может произойти, если модуль имеет неправильный отступ, если вы могли перепутать отступы пробела и табуляции в функции create_player_profile, тогда это также может произойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...