Frage Redirect User zu einer anderen URL mit Django-Allauth-Login-Signal


Ich benutze Django-allauth für meine Anmeldungs- / Anmeldeinformationen. Wenn sich also ein Benutzer (zum ersten Mal) auf meiner Website anmeldet, werde ich ihn zu /thanks/ Seite, indem Sie unten festlegen settings.py Datei

LOGIN_REDIRECT_URL = '/ Danke /'

Aber wenn der Benutzer versuchte, sich das nächste Mal anzumelden (wenn er bereits registriert war), sollte ich ihn umleiten '/dashboard/' URL

Also versuchte ich das zu ändern Django-allauth signals wie unten, was überhaupt nicht funktioniert

@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'))

Also kann mir bitte jemand sagen, wie man einen Benutzer umleitet /dashboard/ Für den normalen Login, mache ich irgendwas falsches im obigen Signalcode?

Bearbeiten

Nach einigen Änderungen gemäß der nachstehenden Antwort von pennersr, mein AccountAdapter Klasse sieht wie folgt aus

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/'

Aber dennoch leitet es den Benutzer zu /dashboard/, meine Logik bei der Bestimmung des ersten Mal Benutzers ist falsch?


21
2017-11-22 06:00


Ursprung


Antworten:


Im Allgemeinen sollten Sie nicht versuchen, solche Logik in einen Signal-Handler zu legen. Was ist, wenn mehrere Handler in verschiedene Richtungen steuern möchten?

Tu dies stattdessen:

# 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/'

21
2017-11-22 11:14



Die zwei Datumsangaben last_login und date_joined wird immer anders sein, obwohl es vielleicht nur ein paar Millisekunden ist. Dieser Ausschnitt funktioniert:

# 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)

Ein wichtige Bemerkung zu pennersr antwort: VERMEIDEN Verwenden von Dateien mit dem Namen allauth.py wie es Django verwirren und führen wird Importfehler.


6
2018-02-27 07:54



Sie können diese beiden anderen Signale einfach mit definieren user_logged_in signalisieren als Basis. Ein guter Platz, um es zu setzen ist auf a Signale.py in einem Konten App, falls Sie eine haben, oder in Ihnen Ader App Denken Sie daran, zu importieren Signale.py in Ihnen __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

0
2017-12-14 13:18