Перенаправление пользователя на другой url с помощью сигнала входа django-allauth
я использую Django-allauth для моего входа/регистрации, поэтому, когда пользователь регистрируется (в первый раз) на моем сайте, я перенаправляю его на /thanks/
страница определив ниже установленной в
LOGIN_REDIRECT_URL = ' / thanks/'
но когда пользователь попытался войти в систему в следующий раз (если уже зарегистрирован), я должен перенаправить его на '/dashboard/'
URL-адресом
поэтому попытался изменить это с Django-allauth signals
, как показано ниже, который не работает все!--11-->
@receiver(allauth.account.signals.user_logged_in)
def registered_user_login(sender, **kwargs):
instance = User.objects.get_by_natural_key(kwargs['user'])
print instance.last_login==instance.date_joined,"??????????????????????????????"
if not instance.last_login==instance.date_joined:
return HttpResponseRedirect(reverse('dashboard'))
так кто-нибудь может пожалуйста, дайте мне знать, как перенаправить пользователя на /dashboard/
для обычного входа в систему я делаю что-то неправильно в приведенном выше сигнальном коде?
редактировать
после некоторой модификации в соответствии с приведенным ниже ответом pennersr
мой
3 ответов
В общем случае вы не должны пытаться поместить такую логику в обработчик сигнала. Что делать, если есть несколько обработчиков, которые хотят управлять в разных направлениях?
вместо этого:
# settings.py:
ACCOUNT_ADAPTER = 'project.users.allauth.AccountAdapter'
# project/users/allauth.py:
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
return '/some/url/'
двумя datetime-значений last_login
и date_joined
всегда будет отличаться, хотя это может быть лишь несколько миллисекунд. Этот фрагмент работает:
# settings.py:
ACCOUNT_ADAPTER = 'yourapp.adapter.AccountAdapter'
# yourapp/adapter.py:
from allauth.account.adapter import DefaultAccountAdapter
from django.conf import settings
from django.shortcuts import resolve_url
from datetime import datetime, timedelta
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
threshold = 90 #seconds
assert request.user.is_authenticated()
if (request.user.last_login - request.user.date_joined).seconds < threshold:
url = '/registration/success'
else:
url = settings.LOGIN_REDIRECT_URL
return resolve_url(url)
один важное замечание в pennersr ответ: избежать использование файлов с именем allauth.py как это запутает Джанго и приведет к ошибки импорта.
вы можете просто определить эти два других сигнала, используя user_logged_in сигнал в качестве базы. Хорошее место, чтобы положить его на signals.py внутри счета app, в случае, если у вас есть один, или в вас базовый app. Просто не забудьте импортировать signals.py в вас __init__.py.
from django.dispatch import receiver, Signal
pre_user_first_login = Signal(providing_args=['request', 'user'])
post_user_first_login = Signal(providing_args=['request', 'user'])
@receiver(user_logged_in)
def handle_user_login(sender, user, request, **kwargs):
first_login = user.last_login is None
if first_login:
pre_user_first_login.send(sender, user=user, request=request)
print 'user_logged_in'
if first_login:
post_user_first_login.send(sender, user=user, request=request)
@receiver(pre_user_first_login)
def handle_pre_user_first_login(sender, user, request, **kwargs):
print 'pre_user_first_login'
pass
@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
print 'post_user_first_login'
pass