web-dev-qa-db-ja.com

Django-allauthログインシグナルを使用してユーザーを別のURLにリダイレクトします

ログイン/サインアップ関連のものに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/にリダイレクトする方法を誰かに教えてもらえますか?上記のシグナルコードで何か問題がありますか?

編集

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/にリダイレクトしています。これは、最初のユーザーが間違っていると判断するための私のロジックですか?

一般に、このようなロジックをシグナルハンドラーに入れようとしないでください。異なる方向に操縦したいハンドラーが複数ある場合はどうなりますか?

代わりに、これを行います。

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

2つの日時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)

1つ重要な注意ペナーズの回答へ:[〜#〜] avoid [〜#〜]混乱するのでallauth.pyという名前のファイルを使用する= Djangoそしてインポートエラーにつながります。

6
dh1tw

ser_logged_inシグナルをベースとして使用して、これら2つの他のシグナルを簡単に定義できます。それを置くのに適した場所は、signals.pyaccountsアプリ内(ある場合)、またはあなたの中にcoreアプリです。 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'
0
Sidnei Pereira