django: не удается подключиться к существующему сигналу

Я начал использовать django_openid_auth ( https://launchpad.net/django-openid-auth), и он работает просто отлично.

Мне удается подключиться к моему провайдеру openid и пройти аутентификацию пользователя. Дело в том, что в django_open_auth.views.login_complete есть этот блок:

if user is not None:
    if user.is_active:
        auth_login(request, user)
        response = HttpResponseRedirect(sanitise_redirect_url(redirect_to))

        # Notify any listeners that we successfully logged in.
        openid_login_complete.send(sender=UserOpenID, request=request,
            openid_response=openid_response)

        return response
    else:
        return render_failure(request, 'Disabled account')

Обратите внимание на комментарий #notify.

Я создал свой собственный подкласс OpenIdBackend класса OpenIDBackend django-openid-auth и поместил его в core.authentication.openidbackend моего собственного проекта

В этом файле есть: из django_openid_auth.signals импорт openid_login_complete

def update_request(sender, **kwargs):
    logger.debug('test')

openid_login_complete.connect(update_request)

Но эта строка отладки никогда не появляется в журнале.

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

Но как я могу отладить это? В чем проблема - никогда не происходит соединение, потому что я поставил соединение в неправильное место или проблема в другом месте? Как я могу это выяснить?

Алан

Изменить: я попробовал все, что было предложено сразу, и я получил его на работу. Я поместил сигнал в отдельный файл, импортировал его в правильном месте и также следовал совету, данному karthikr ( karthikr). Я также заметил, что мой регистратор не использовал правильную конфигурацию регистрации, поэтому, возможно, все работало раньше, только то, что регистрация не работала.

Так что да:). Не должно работать, когда ты плохо себя чувствуешь:). Спасибо за помощь, ребята!

1 ответ

Решение

Где вы кодируете этот сигнал обратного вызова? Вы импортируете модуль, в котором регистрируете обратный вызов до того, как сигнал будет отправлен?

Например, я использовал сигналы и кодировать в my_app/signals.py, Позже я иду в my_app/models.py и добавьте строку:

import my_app.signals

Файл, в который вы записываете свои обратные вызовы, должен быть импортирован до того, как появятся сигналы:

Где должен жить этот код? Вы можете разместить код обработки сигнала и регистрационный код где угодно. Однако вам необходимо убедиться, что модуль, в котором он находится, будет импортирован на ранней стадии, чтобы обработка сигналов была зарегистрирована до того, как какие-либо сигналы будут отправлены. Это делает models.py вашего приложения хорошим местом для регистрации обработчиков сигналов.

Также вы можете попробовать зарегистрироваться на @register декоратор. Это почти то же самое, но вы можете попробовать проверить, работает ли он другим способом:

from django_openid_auth.signals import openid_login_complete
from django.dispatch import receiver

@receiver(openid_login_complete)
def update_request(sender, **kwargs):
    logger.debug('test')

Надеюсь, это поможет!

Другие вопросы по тегам