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