Подтвердить что ты не робот

Перенаправить пользователя на другой 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/, моя логика в определении первого пользователя неправильная?

4b9b3361

Ответ 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'