Перенаправить пользователя на другой URL-адрес с сигналом входа django-allauth
Я использую Django-allauth для своих материалов, связанных с регистрацией/регистрацией, поэтому, когда пользователь регистрируется (первый раз) на моем сайте, я перенаправляю его на страницу /thanks/
, определяя ниже настройку в settings.py
файле
LOGIN_REDIRECT_URL = '/thanks/'
Но когда пользователь попытался войти в систему в следующий раз (если он уже зарегистрирован), я должен перенаправить его на '/dashboard/'
URL
Поэтому попытался изменить это с помощью Django-allauth signals
, как показано ниже, который не работает вообще
@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/
для обычного входа в систему, я делаю что-то неправильно в приведенном выше коде кода?
Edit
После некоторой модификации в соответствии с приведенным ниже ответом pennersr
мой класс AccountAdapter
выглядит ниже
from allauth.account.adapter import DefaultAccountAdapter
# from django.contrib.auth.models import User
class AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(self, request):
if request.user.last_login == request.user.date_joined:
return '/registration/success/'
else:
return '/dashboard/'
Но все-таки перенаправляет пользователя на /dashboard/
, моя логика в определении первого пользователя неправильная?
Ответы
Ответ 1
В общем, вы не должны пытаться поместить такую логику в обработчик сигнала. Что делать, если есть несколько обработчиков, которые хотят управлять в разных направлениях?
Вместо этого сделайте следующее:
# 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/'
Ответ 2
Два времени d 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: AVOID, используя файлы с именем allauth.py, поскольку это смутит Django и приведет к import ошибки.
Ответ 3
Вы можете просто определить эти два других сигнала, используя сигнал user_logged_in в качестве базы. Хорошее место, чтобы поместить его в файл signal.py в приложении учетных записей, если оно у вас есть, или в вашем основном приложении. Только не забудьте импортировать 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'
@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
print 'post_user_first_login'