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')
Надеюсь, это поможет!